在spring boot微服务中设置JWT令牌生成中的两个主题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在spring boot微服务中设置JWT令牌生成中的两个主题相关的知识,希望对你有一定的参考价值。

我正在尝试为我的微服务生成一个JWT令牌。该令牌将使用我的前端应用程序进行服务访问。在这里,我通过添加我的用户名来设置主题。我需要添加用户ID和用户名。我只是通过添加主题“用户名”来生成令牌的代码。

我的代码是,

protected String getToken(String encodedSecret, Users jwtUser){
    return Jwts.builder()
            .setId(UUID.randomUUID().toString())
            .setSubject(jwtUser.getUsername())
            .signWith(SignatureAlgorithm.HS512, encodedSecret)
            .compact();
}

在这里,我需要使用userid添加两个主题用户名。我怎么能在这里添加两个主题?任何人都可以帮我解决这个问题吗?

答案

您根本不能拥有两个或多个具有相同名称的声明:

4. JWT Claims

JWT声明集表示JSON对象,其成员是JWT传达的声明。 JWT索赔集中的索赔名称必须是唯一的; JWT解析器必须拒绝具有重复声明名称的JWT或使用仅返回词法上最后重复成员名称的JSON解析器[...]

但是,您可以使用另一个用户ID声明:

return Jwts.builder()
           .setId(UUID.randomUUID().toString())
           .setSubject(jwtUser.getUsername())
           .signWith(SignatureAlgorithm.HS512, encodedSecret)
           .claim("user-id", "id goes here")
           .compact();

我可以添加一个对象而不是整数吗?喜欢JSON?

是的,声明值可以是任意JSON值,但声明名称必须是字符串:

2. Terminology

[...]

索赔名称 索赔表示的名称部分。声明名称始终是字符串。**

索赔价值 索赔表示的价值部分。声明值可以是任何JSON值。

[...]

3. JSON Web Token (JWT) Overview

JWT将一组声明表示为JSON对象,该对象在JWS和/或JWE结构中编码。此JSON对象是JWT声明集。 [...] JSON对象由零个或多个名称/值对(或成员)组成,其中名称是字符串,值是任意JSON值。这些成员是JWT代表的权利要求。 [...]

所以你可以定义一个类:

class UserDetails {

    private Integer id;
    private List<String> roles;

    public UserDetails(Integer id, String... roles) {
        this.id = id;
        this.roles = Arrays.asList(roles);
    }

    public Integer getId() {
        return id;
    }

    public UserDetails setId(Integer id) {
        this.id = id;
        return this;
    }

    public List<String> getRoles() {
        return roles;
    }

    public UserDetails setRoles(List<String> roles) {
        this.roles = roles;
        return this;
    }
}

然后使用如下:

return Jwts.builder()
           .setId(UUID.randomUUID().toString())
           .setSubject(jwtUser.getUsername())
           .signWith(SignatureAlgorithm.HS512, encodedSecret)
           .claim("user-details", new UserDetails(1, "ROLE_1", "ROLE_2"))
           .compact();

它将产生以下有效负载:

{
  "jti": "d65b83fd-fafb-4df4-9782-c4700c3c93ff",
  "sub": "joe.doe",
  "user-details": {
    "id": 1,
    "roles": [
      "ROLE_1",
      "ROLE_2"
    ]
  }
}

以上是关于在spring boot微服务中设置JWT令牌生成中的两个主题的主要内容,如果未能解决你的问题,请参考以下文章

如何将一些附加字段添加到此 Spring Boot 服务生成的 JWT 令牌中?

如何在所有请求标头中传递授权令牌 - Spring Boot java

spring boot - 假装客户端发送基本授权标头|将 jwt 令牌从一个微服务传递到另一个微服务

架构微服务 Spring Boot

Spring Boot:过期后如何生成新的访问令牌?

如何在 JWT Header 中设置 JWT 类型