当前位置: 首页 > 知识库问答 >
问题:

将jwt交换为访问令牌会返回invalid_grant错误

丁文轩
2023-03-14

我正在尝试为我的应用程序实现服务集成身份验证-管理员同意。我是这样创建jwt的:

class Program
{
    static void Main(string[] args)
    {
        #region Test

        string integratorKey = "integratorKey ";
        string userId = "userId ";
        string serverAddress = "serverAddress";
        string scope = "signature";
        string key = @"C:\Users\Tester\Desktop\privatekey.txt";

        // JWT Header
        // The header specfies the token type and the signature algorithm
        var jwtHeader = new JwtHeader
        {
            { "typ ", "JWT "},
            { "alg", "RS256"},
        };

        // JWT Body
        // The body specfies the account and user id granting consen
        var jwtPayload = new JwtPayload
        {
           { "iss ", integratorKey},
           { "sub", userId},
           { "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds()},
           { "exp", DateTimeOffset.UtcNow.AddHours(1).ToUnixTimeSeconds()},
           { "aud", serverAddress},
           { "scope", scope}
        };

        // JWT Signature
        // The body contains the result of signing the base64url-encoded header and body
        string pemKey = File.ReadAllText(key);
        var rsa = CreateRSAKeyFromPem(pemKey);
        RsaSecurityKey rsaKey = new RsaSecurityKey(rsa);

        var jwtSecurityToken = new JwtSecurityToken(jwtHeader, jwtPayload);
        jwtSecurityToken.SigningKey = rsaKey;

        // Token to String so you can use it in your client
        var jwtHandler = new JwtSecurityTokenHandler();
        var tokenString = jwtHandler.WriteToken(jwtSecurityToken);
        #endregion
    }

    public static RSA CreateRSAKeyFromPem(string key)
    {
        TextReader reader = new StringReader(key);
        PemReader pemReader = new PemReader(reader);

        object result = pemReader.ReadObject();

        if (result is AsymmetricCipherKeyPair)
        {
            AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)result;
            return DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)keyPair.Private);
        }
        else if (result is RsaKeyParameters)
        {
            RsaKeyParameters keyParameters = (RsaKeyParameters)result;
            return DotNetUtilities.ToRSA(keyParameters);
        }

        throw new Exception("Unepxected PEM type");
    }
}

我已经在 jwt.io 上验证了此代码生成的令牌,一切看起来都不错。但是,当我尝试使用Postman将生成的jwt交换为访问代码时,我总是会得到“invalid_grant”,这是我在postman中发出请求的方式:

POST https://account-d.docusign.com/oauth/token
-Headers: Content-Type application/x-www-form-urlencoded

-Body: grant_type urn:ietf:params:oauth:grant-type:jwt-bearer assertion [Generated jwt]

我什至尝试过把

Headers: Authorization Basic b64encoded(integratorKey:secretKey) 

以及,但仍然没有运气。

你能指出我在这里做错了什么吗?谢谢:)

共有1个答案

谭京
2023-03-14

好的,我自己已经弄清楚了问题所在,现在我可以在邮差中接收访问令牌。我改变了三件事,使这项工作得以实现:

>

  • 当我从组织门户授权应用程序时,我已将应用程序分配给不正确的集成商密钥,因此我需要将其更改为指向正确的密钥。

    我在C# SDK中找到了生成jwt的代码,所以我用它来确保创建的jwt被DocuSign接受:

    static void Main(string[] args)
    {
        string integratorKey = "integratorKey ";
        string userId = "userId ";
        string serverAddress = "account-d.docusign.com";
        string scope = "signature impersonation";
        string privateKeyFilename = @"C:\Users\Tester\Desktop\privatekey.txt";
    
        JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
    
        SecurityTokenDescriptor descriptor = new SecurityTokenDescriptor()
        {
            IssuedAt = DateTime.UtcNow,
            Expires = DateTime.UtcNow.AddHours(1)
        };
    
        descriptor.Subject = new ClaimsIdentity();
        descriptor.Subject.AddClaim(new Claim("scope", scope));
        descriptor.Subject.AddClaim(new Claim("aud", serverAddress));
        descriptor.Subject.AddClaim(new Claim("iss", integratorKey));
    
        if (userId != null)
        {
            descriptor.Subject.AddClaim(new Claim("sub", userId));
        }
    
        if (privateKeyFilename != null)
        {
            string pemKey = File.ReadAllText(privateKeyFilename);
            var rsa = CreateRSAKeyFromPem(pemKey);
            RsaSecurityKey rsaKey = new RsaSecurityKey(rsa);
            descriptor.SigningCredentials = new SigningCredentials(rsaKey, SecurityAlgorithms.RsaSha256Signature, SecurityAlgorithms.HmacSha256Signature);
        }
    
        var token = handler.CreateToken(descriptor);
        string jwtToken = handler.WriteToken(token);
    }
    
    public static RSA CreateRSAKeyFromPem(string key)
    {
        TextReader reader = new StringReader(key);
        PemReader pemReader = new PemReader(reader);
    
        object result = pemReader.ReadObject();
    
        if (result is AsymmetricCipherKeyPair)
        {
            AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)result;
            return DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)keyPair.Private);
        }
        else if (result is RsaKeyParameters)
        {
            RsaKeyParameters keyParameters = (RsaKeyParameters)result;
            return DotNetUtilities.ToRSA(keyParameters);
        }
    
        throw new Exception("Unepxected PEM type");
    }
    

    在我做了更改1和2之后,我仍然在Postman中有一个错误:“需要同意”。结果是我必须向我的集成器键添加一个重定向uri,然后导航到这个url:

    SERVER/oauth/auth?response_type=code&scope=signature%20impersonation&client_id=CLIENT_ID&redirect_uri=https://docusign.com
    

    然后单击“授予”。

    希望这有所帮助。

  •  类似资料:
    • 我知道这里有人问过这个问题。然而,在这个问题上没有一行代码。我将分享我的代码,以便它可以帮助我和其他可能面临相同问题的人。 这里遵循代码... } } 因此,我使用以下命令创建了一个具有同化密钥的JWT: keytool-genkeypair-alias mytest-keyalg RSA-keypass mypass-keystore mytest。jks-storepass mypass 由于

    • 我很难让Auth0以JWT格式返回访问令牌。我需要JWT格式的文件,以便使用javajwt库验证它们。 我正在使用Auth0登录,并使用获取访问令牌-我尝试将访问群体设置为我们的API标识符(在多个位置,包括lock auth参数和负载),但没有成功-返回访问令牌,但不是JWT。 或者,是否有用于验证“本机”Auth0访问令牌的Java库? 返回的代码用于POST到

    • 发生重定向时,google将重定向到我们的url https://myurl.com/callback?code=somecode 第三步: 反应回来了: HTTP 400错误请求 有人能帮我解决这个问题吗?谢谢!

    • 这是我的身份验证流程: 用户登录后收到两个令牌(具有过期时间的访问令牌和没有过期时间的刷新令牌) 对于每个用户,刷新令牌存储在数据库中名为refreshTokens的json列中(这是一个数组) 在客户端,访问令牌和刷新令牌都存储在本地存储器上 当需要验证用户时,如果访问令牌过期,将使用刷新令牌创建一个新的访问令牌,并将其发送回用户并保持用户登录 当用户注销时,数据库中存储的刷新令牌(在refre

    • 我在同意的情况下为我的应用程序手动/php sdk创建了docusignjwt访问令牌,并在restapi的代码中使用了该访问令牌。访问令牌的到期时间为1小时。如何在不征求同意的情况下一次又一次地更新DocuSign jwt访问令牌?或者如何延长访问令牌的到期时间?

    • null 实现基于Spring Boot with Spring Security(OAuth2)。我有以下工作2LA流程: RP可以使用和向AS发送访问令牌请求。 AS使用访问令牌响应RP。 RP能够使用所述接入令牌向RS发出授权请求。 RS能够使用AS上的endpoint验证访问令牌。 问题:在上面的步骤1中,我需要对我的AS进行哪些更改,以便它接受基于JWT的访问令牌请求? RP OAuth

    • 我有一个使用 Msal 库获取的 Azure AD JWT 令牌,但是当我尝试验证此令牌时出现问题: 客户端:共享点 Web 部件 另一方面,我有一个服务器应用程序(Java),其中验证了访问令牌 验证人: 法典 我的问题是,当我尝试验证此令牌时,我收到了此错误:使用算法验证时,令牌的签名无效:SHA256with RSA 我被困在这个,如果令牌是正确的,为什么我有这个错误? 问候

    • 我正在使用以下示例来玩Spring Cloud OAuth2实现: https://github.com/spring-cloud-samples/authserver https://github.com/spring-cloud-samples/sso 第一个是OAuth服务器,它在对用户进行身份验证时生成JWT令牌。第二个是正在被消耗的资源。根据OAuth规范,资源将用户的身份验证转发给au