【问题标题】:How to access the JWT Token and then process the request?如何访问 JWT Token 然后处理请求?
【发布时间】:2019-10-18 03:11:56
【问题描述】:

我得到了一个 spring boot web api 项目。有一个颤振应用程序会将 jwt 令牌作为请求发送,api 必须从有效负载中获取“票证”值,然后检查数据库并发送所需的数据。我完全是这个领域的新手,但我别无选择,只能完成它。

我想通过接受令牌并尝试对其进行解码并获取“票证”值来使事情变得简单。但我无法这样做,因为我一开始就无法获得令牌。 身份验证由其他一些 api 完成,并将 jwt 令牌提供给颤振应用程序。然后颤振应用程序将在任何请求中将该令牌发送到我的 api。我有一个包含所需数据的示例数据库,并且必须使用数据库中的“票证”(充当用户名)解析请求并提供数据。我不必执行任何身份验证部分 - 我只需从请求中提取令牌 - 对其进行解码并获取“票证”值,并且必须搜索数据库并提供数据。

token : eyJhbGciOiJIUzUxMiJ9.eyJ0aWNrZXQiOiJzdmxhZGFAZ21haWwuY29tIiwic2NvcGVzIjpbIlJPTEVfQURNSU4iLCJST0xFX1BSRU1JVU1fTUVNQkVSIl0sImlzcyI6Imh0dHA6Ly9zdmxhZGEuY29tIiwiaWF0IjoxNDcyMzkwMDY1LCJleHAiOjE0NzIzOTA5NjV9.uaHqDrTNnn5TAljcWRYac9ifJJv5NR5cdn7id2xVCAKLD37_pY62jPlk70XtwqgSar03n2qEgzWyTdWXRcnsgQ

reuest : localhost:8080/persons?access_token=eyJhbGciOiJIUzUxMiJ9.eyJ0aWNrZXQiOiJzdmxhZGFAZ21haWwuY29tIiwic2NvcGVzIjpbIlJPTEVfQURNSU4iLCJST0xFX1BSRU1JVU1fTUVNQkVSIl0sImlzcyI6Imh0dHA6Ly9zdmxhZGEuY29tIiwiaWF0IjoxNDcyMzkwMDY1LCJleHAiOjE0NzIzOTA5NjV9.uaHqDrTNnn5TAljcWRYac9ifJJv5NR5cdn7id2xVCAKLD37_pY62jPlk70XtwqgSar03n2qEgzWyTdWXRcnsgQ

代码不是必需的,我只是想了解它是如何工作的。 YouTube 中有很多视频,但它们都集中在我不必执行的身份验证上,并且没有显示如何处理来自应用程序的请求。任何资源也将是一个很大的帮助。谢谢。

【问题讨论】:

  • 您应该使用 Spring Security OAuth2。在这样的 GET 请求中发送凭据是非常糟糕的做法;它们应该在 Authorization 标头中,因此它们不会被记录或缓存。 Spring Security 将负责为您解码令牌(一旦您提供密钥),然后您可以使用常规 @PreAuthorize 和类似的方法添加访问规则。
  • @chrylis 好吧,颤振应用程序的部分不在我的控制范围内。他们只是说令牌将是唯一作为请求发送到 api 的东西,然后 api 应该解决它并使用它来获取所需的数据。谢谢你的回答。

标签: java rest api spring-boot xmlhttprequest


【解决方案1】:
reuest : localhost:8080/persons?access_token=eyJhbGciOiJIUzUxMiJ9.eyJ0aWNrZXQiOiJzdmxhZGFAZ21haWwuY29tIiwic2NvcGVzIjpbIlJPTEVfQURNSU4iLCJST0xFX1BSRU1JVU1fTUVNQkVSIl0sImlzcyI6Imh0dHA6Ly9zdmxhZGEuY29tIiwiaWF0IjoxNDcyMzkwMDY1LCJleHAiOjE0NzIzOTA5NjV9.uaHqDrTNnn5TAljcWRYac9ifJJv5NR5cdn7id2xVCAKLD37_pY62jPlk70XtwqgSar03n2qEgzWyTdWXRcnsgQ

根据上述要求,您可以如下设计控制器:

    @GetMapping("/persons")
        public ResponseEntity loadPersons(@RequestParam("access_token") String access_token,HttpServletRequest request){
         //Here you can play with the token now 

        //you can also get the token if it is coming with request header as follows :
           String token =request.getHeader("access_token");//replace with the specific key

        }

例如

public boolean isValidJWTToken(String jwtToken){
        boolean isValid = true;
        try {
            Jwts.parser().setSigningKey(generateKey()).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            isValid = false;
        }
        return isValid;
    }
private Key generateKey() {

        byte[] keyBytes=environment.getProperty("auth.jwt.secret.key").getBytes();

        return new SecretKeySpec(keyBytes, 0,keyBytes.length,environment.getProperty("auth.jwt.secret.algo"));
    }

JWT Token 有 3 个部分。

1. HEADER:ALGORITHM & TOKEN TYPE
2. PAYLOAD:DATA
3. SIGNATURE

以上 3 个部分都是您的业务驱动的。所以你可以更好地知道哪个是用于 encode 的算法。因此,您可以进行解码。

【讨论】:

  • 好的,我确实在@GetMapping 部分上面得到了这个,但如果我没有错的话,给定的示例实际上是生成 jwt Token 。但就我而言,我不应该担心那个生成部分,因为我会得到令牌。所以,只有 GetMapping 部分才是我应该担心的。对吗?
  • 如果他们将令牌作为标头发送怎么办>?它会以同样的方式工作吗?谢谢你的回答。
  • 检查标题的编辑答案..... isValidJWTToken ...方法实际上是验证令牌..而不是创建部分......
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2020-04-07
  • 2015-02-13
  • 2020-08-31
  • 2018-06-21
  • 2021-09-29
相关资源
最近更新 更多