如何生成OAuth 2客户端Id和Secret

本文关键字:Id Secret 客户端 何生成 OAuth | 更新日期: 2023-09-27 18:03:12

我想使用。net生成客户端id和客户端秘密。我阅读了OAuth 2规范,例如没有指定客户端密钥的大小。有没有使用。net框架生成客户端id和客户端秘密的好方法?

如何生成OAuth 2客户端Id和Secret

正如OAuth 2.0授权框架第2.2节所说:

授权服务器向注册的客户端颁发客户端标识符——表示注册的唯一字符串客户端提供的信息。客户端标识符不是秘密;它是公开给资源所有者的,绝对不能使用单独用于客户端身份验证。客户端标识符是唯一的授权服务器。

客户端标识符字符串的大小没有定义规范。客户应避免对…做假设标识符的大小。授权服务器应该记录大小

所以你可以自己定义客户端标识符。这取决于你的选择。您可以使用System.Guid简单地生成一个,或者使用uid + systemTime,也可以对其进行Hash,加密或任何您想要的其他操作。

但是客户端秘密应该是一个密码学上强的随机字符串。您可以像这样生成一个:

RandomNumberGenerator cryptoRandomDataGenerator = new RNGCryptoServiceProvider();
byte[] buffer = new byte[length];
cryptoRandomDataGenerator.GetBytes(buffer);
string uniq = Convert.ToBase64String(buffer);
return uniq;

你也可以使用加密哈希函数()来哈希UUID+SystemTime+其他东西来实现它。

如果你想知道更多的实践,你可以从这里参考一些开放的实现。

下面是在PowerShell中生成ClientSecret密钥的代码

$bytes = New-Object Byte[] 32
$rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
$rand.GetBytes($bytes)
$rand.Dispose()
$newClientSecret = [System.Convert]::ToBase64String($bytes)
$newClientSecret

我在这里找到了https://learn.microsoft.com/en-us/sharepoint/dev/sp-add-ins/replace-an-expiring-client-secret-in-a-sharepoint-add-in#generate-a-new-secret

附录A.1和A.2在其ABNF语法中将client_idclient_secret的格式定义为*VSCHAR,其中VSCHAR定义为

VSCHAR     = %x20-7E

表示可打印的ASCII字符集。client_id的长度在规范中没有指定,正如@Owen Tsao所指出的那样。这意味着,尽管可以选择一个随机的字节序列并用base64对它们进行编码,但是base64中出现的字符集仅代表此应用程序中可用字符的严格子集。