如何使用PowerShell为OAuth公共客户端编码PKCE代码

如何使用PowerShell为OAuth公共客户端编码PKCE代码,powershell,Powershell,我正试图生成一个43个八位字节(字节)的字符串,用作使用PowerShell进行OAuth身份验证的代码验证器,如中所述 协议 4.1。客户端创建代码验证程序 客户机首先为每台计算机创建一个代码验证器“代码验证器” OAuth 2.0[RFC6749]授权请求,方式如下: code_verifier=使用 无保留字符[A-Z]/[A-Z]/[0-9]/“-”/“/”\u“/“~” 来自[RFC3986]第2.3节,最小长度为43个字符 最大长度为128个字符 $RandomNumberGener

我正试图生成一个43个八位字节(字节)的字符串,用作使用PowerShell进行OAuth身份验证的代码验证器,如中所述

  • 协议
  • 4.1。客户端创建代码验证程序

    客户机首先为每台计算机创建一个代码验证器“代码验证器” OAuth 2.0[RFC6749]授权请求,方式如下:

    code_verifier=使用 无保留字符[A-Z]/[A-Z]/[0-9]/“-”/“/”\u“/“~”
    来自[RFC3986]第2.3节,最小长度为43个字符 最大长度为128个字符

    $RandomNumberGenerator = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
        $Bytes = New-Object Byte[] 32
        $RandomNumberGenerator.GetBytes($Bytes)
        [System.Convert]::ToBase64String($bytes)
    
    “代码校验器”的ABNF如下所示

    代码验证器=43*128未保留未保留=字母/数字/ “-”/“/”/“/”α=%x41-5A/%x61-7A数字=%x30-39

    注意:代码验证器应该有足够的熵使其成为
    猜测价值是不切实际的建议 可以使用合适的随机数生成器创建32个八位组
    序列然后对八位字节序列进行base64url编码,以生成一个
    43用作代码验证程序的八位字节URL安全字符串

    我发现使用RNGCryptoServiceProvider类更可能生成高熵随机数,但当我将其转换为base64字符串时,它包含不需要的字符

    $RandomNumberGenerator = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
        $Bytes = New-Object Byte[] 32
        $RandomNumberGenerator.GetBytes($Bytes)
        [System.Convert]::ToBase64String($bytes)
    

    如何使用RNGCryptoServiceProvider生成兼容的base64字符串?

    您需要Url安全的base64编码,这可以通过使用System.Web中的方法来完成

    Add-Type -AssemblyName System.Web
    
    $RandomNumberGenerator = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
    $Bytes = New-Object Byte[] 32
    $RandomNumberGenerator.GetBytes($Bytes)
    [System.Web.HttpServerUtility]::UrlTokenEncode($Bytes)
    
    最后一个字符可能是填充字符。对于“正常”Base64,使用
    =
    urltokencode()
    使用不同的(url安全的)字母表,其中填充字符为
    1
    使用以下命令修剪最后一个填充字符应该是非常安全的:

    ([System.Web.HttpServerUtility]::UrlTokenEncode($Bytes)).TrimEnd("1")
    


    为了确保获得43个字符的字符串。

    显然,我需要一个不带“+”或“/”的43个字符的base64字符串。