当前位置: 首页 > 面试题库 >

如何在Go中从AWS Cognito验证JWT令牌?

红砚文
2023-03-14
问题内容

如何验证从Amazon Cognito收到的JWT并从中获取信息?

我已经在Cognito中设置了Google身份验证,并将重定向uri设置为打API Gateway,然后收到了我发布到此端点的代码:

https://docs.aws.amazon.com/cognito/latest/developerguide/token-
endpoint.html

要接收JWT令牌,采用RS256格式。我现在正在努力验证和解析Golang中的令牌。我尝试使用jwt-
go解析它,但默认情况下它似乎支持HMAC并阅读他们建议使用前端验证的地方。我尝试了其他一些软件包,并遇到了类似的问题。
但是假设代码已经过时,就像刚才说的那样panic: unable to find key

jwt.io可以轻松解码密钥,并且可能也进行验证。我不确定公钥/密钥在Amazon生成令牌时的位置,但是据我了解,我也需要使用JWK
URL进行验证吗?我找到了一些特定于AWS的解决方案,但它们似乎都长达数百行。当然,在Golang中不是那么复杂吗?


问题答案:

Amazon Cognito的公钥

正如您已经猜到的那样,您将需要公共密钥才能验证JWT令牌。

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-
user-pools-using-tokens-verifying-a-jwt.html#amazon-cognito-user-pools-using-
tokens-第2步

为您的用户池下载并存储相应的公共JSON Web密钥(JWK)。它可作为JSON Web密钥集(JWKS)的一部分使用。您可以在https://
cognito-idp上找到它 。{region} .amazonaws.com /
{userPoolId} /。well-known / jwks.json

解析密钥并验证令牌

该JSON文件结构已在网络中记录,因此您可以潜在地手动解析,生成公钥等。

但是只使用一个库可能会更容易,例如,一个库:https :
//github.com/lestrrat-go/jwx

然后jwt-go处理JWT部分:https :
//github.com/dgrijalva/jwt-go

然后,您可以:

1)使用第一个库下载并解析公共密钥JSON

keySet, err := jwk.Fetch(THE_COGNITO_URL_DESCRIBED_ABOVE)

2)使用jwt-go解析令牌时,请使用JWT标头中的“ kid”字段来找到要使用的正确密钥

token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    if _, ok := token.Method.(*jwt.SigningMethodRS256); !ok {
        return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
    }
    kid, ok := token.Header["kid"].(string)
    if !ok {
        return nil, errors.New("kid header not found")
    }
    keys := keySet.LookupKeyID(kid);
    if len(keys) == 0 {
         return nil, fmt.Errorf("key %v not found", kid)
    }
    return keys[0].Materialize()        
})


 类似资料:
  • 一旦我们在前端获得JWT令牌,我们就可以通过使用授权头或通过cookies来验证后端服务器中的无状态重启。这段视频很好地解释了这一点。 如果后端服务器在C#中。网络框架(MVC),如何验证接收到的JWT?官方留档指向OWIN,这是不维护。 当看到各种各样的博客和文档时,理论上说我们需要得到模数 如何才能做到这一点?

  • 我已经创建了自定义中间件类来验证JWT令牌。我在

  • 我目前正在使用Vapor开发Swift后端。我的iOS客户端使用新的iOS 13功能“使用Apple登录”。当用户登录时,我会得到一个身份令牌(访问令牌),这是一个由Apple签名的有效JWT令牌。这将在所有正在进行的通信中发送到服务器,以验证服务器提供的某些路由。 在服务器上,我想通过验证令牌签名来验证发送的令牌是否确实由Apple签名,并且不是由某些恶意用户专门创建的。Apple提供了一个HT

  • 我有一个Rest Spring BootAPI,当用户验证API返回令牌jwt时,我在浏览器中注意到该令牌出现在响应头中 如何通过Reactjs将此令牌存储在本地存储浏览器中? 我的请求代码如下所示:

  • 我正在制作一个javascript客户端,它使用JWT令牌连接到Api。在服务器端没有问题,我可以创建令牌对其进行签名,然后验证签名,从而确保没有人篡改令牌。 但我如何在客户端做到这一点。我可以解码JWT令牌并查看头、负载和签名。但是如何在客户端验证签名?是否有用于此的库,如何将公钥传输到客户端? 如果我不验证签名,我怎么知道令牌没有被篡改?