如何验证我从Cognito获得的jwt令牌

时间:2018-03-26 09:50:49

标签: java amazon-web-services spring-boot jwt aws-cognito

我有一个jwt令牌,我在用户登录后从cognito中检索过。

我的应用程序中有一个特定的api端点,我希望只有拥有有效jwt的用户才能访问此端点。我试着查看网上的各种资源,但我什么都听不懂。我是jwt概念的新手。

PS我有一个Java应用程序(spring boot)。如果有人能详细描述我需要遵循以验证我的jwt的步骤,我真的很感激。如果可能,请提供代码。

@CrossOrigin
@RequestMapping(value= "/login", method=RequestMethod.POST,consumes="application/json")
@ResponseBody
public String authenticate(@RequestBody SignInDTO signInDetails)
{
    //boolean isAuthenticated=false;
        CognitoHelper cognitoHelper=new CognitoHelper();
        String authResult=cognitoHelper.ValidateUser(signInDetails.getEmailId(), signInDetails.getPassword());
.....
.....
.....

authResult是我从cognito获得的jwt。在此之后,我完全不知道需要做什么。

5 个答案:

答案 0 :(得分:1)

Spring Security 5.1引入了对此的支持,因此更容易实现。参见https://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#oauth2resourceserver

基本上:

  1. 按照https://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#dependencies
  2. 所述添加依赖项
  3. 按照https://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#oauth2resourceserver-minimalconfiguration所述添加yml配置。对于cognito,请使用以下网址:https://cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>
  4. 您可能需要按照https://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#oauth2resourceserver-sansboot
  5. 所述编辑安全性配置

答案 1 :(得分:0)

使用像java-jwt这样的库(我想你正在使用Maven)

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.3.0</version>
</dependency>

然后:

String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
    Algorithm algorithm = Algorithm.HMAC256("secret");
    // or
    Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey);
    JWTVerifier verifier = JWT.require(algorithm)
        .withIssuer("auth0")
        .build(); //Reusable verifier instance
    DecodedJWT jwt = verifier.verify(token);
} catch (UnsupportedEncodingException exception){
    //UTF-8 encoding not supported
} catch (JWTVerificationException exception){
    //Invalid signature/claims
}

您可以在此处手动解码jwt-tokenhttps://jwt.io
有关java-jwt的更多信息:https://github.com/auth0/java-jwt

答案 2 :(得分:0)

第1步:确认JWT的结构

第2步:验证JWT签名

第3步:验证声明

转到https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html了解更多信息。

答案 3 :(得分:0)

对于最低限度的要求,您需要spring-boot-starter-oauth2-resource-server和spring-boot-starter-security依赖项。您可能还需要spring-security-oauth2-jose依赖项。

然后,您需要在属性或yml文件中设置发行者Uri。您可以在访问令牌有效负载中找到该值,作为“ iss”值。 spring.security.oauth2.resourceserver.jwt.issuer-uri:

使用卷发进行测试

curl -o /dev/null -s -w "%{http_code}\n" -H "Authorization: Bearer ey..." http://localhost:8080/hello

答案 4 :(得分:-1)

Here's如何验证令牌(它是用Kotlin编写的)。

密钥所在的位置:

https://cognito-idp。$ regionName.amazonaws.com/$cognitoUserPoolId/.well-known/jwks.json

我在这里实现了一堆: https://github.com/awslabs/cognito-proxy-rest-service