首页 > 解决方案 > 使用 java 库 auth0-java 为 JitsiMeet 生成 jwt 令牌

问题描述

与此 github 问题相关:

https://github.com/auth0/auth0-java/issues/228

我需要了解如何使用 JWT Token 管理复杂的声明对象

我正在尝试为 Jitsimeet 生成一个 JWt 令牌,但我对如何使用 java API 有一些疑问,这里我需要在 jwt 上编码的有效负载:

标头(使用 RS256 公钥验证)

{
  "kid": "jitsi/custom_key_name",
  "typ": "JWT",
  "alg": "RS256"
}

有效载荷

{
  "context": {
    "user": {
      "avatar": "https:/gravatar.com/avatar/abc123",
      "name": "John Doe",
      "email": "jdoe@example.com",
      "id": "abcd:a1b2c3-d4e5f6-0abc1-23de-abcdef01fedcba"
    },
    "group": "a123-123-456-789"
  },
  "aud": "jitsi",
  "iss": "my_client",
  "sub": "meet.jit.si",
  "room": "*",
  "exp": 1500006923
}

这里是我的java代码

    public static String generateFrom(String username,String email,String room,String appid,String hostname) {
        try {
            Date expirationDate = Date.from(ZonedDateTime.now().plusHours(24).toInstant());
            Date issuedAt = Date.from(ZonedDateTime.now().toInstant());

            User user = new User();
            user.setAvatar("");
            user.setEmail(email);
            user.setName(username);
            user.setId(username);

            Context  context = new Context();
            context.setUser(user);


            JwtToken jwtToken = new JwtToken();
            jwtToken.setContext(context);
            jwtToken.setAud(appid);
            jwtToken.setIss(appid);
            jwtToken.setSub(hostname);
            jwtToken.setRoom(room);
            jwtToken.setExp(String.valueOf(expirationDate.getTime()));

            //Claim claimUser = new com.auth0.jwt.JWTCreator.Builder().

            //HEADER
            Map<String, Object> headerClaims = new HashMap<String,Object>();
            headerClaims.put(PublicClaims.KEY_ID, "jitsi/"+appid);//"kid"
            headerClaims.put(PublicClaims.ALGORITHM,"HS256");//"alg
            headerClaims.put(PublicClaims.TYPE,"JWT");//"typ"

            //PAYLOAD
            Map<String, Object> claims = new HashMap<String, Object>();
            claims.put("context",jwtToken.getContext());
            claims.put("aud",jwtToken.getAud());
            claims.put("iss",jwtToken.getIss());
            claims.put("sub",jwtToken.getSub());
            claims.put("room",jwtToken.getRoom());
            claims.put("exp",jwtToken.getExp());    
            //https://github.com/auth0/java-jwt
            return JWT.create()
                    .withHeader(headerClaims)
                    .withIssuer(jwtToken.getIss())
                    .withSubject(jwtToken.getSub())
                    .withAudience(jwtToken.getAud())
                    .withIssuedAt(issuedAt)
                    .withExpiresAt(expirationDate)
                    //CLAIM                 
                    .withClaim("aud",jwtToken.getAud())
                    .withClaim("iss",jwtToken.getIss())
                    .withClaim("sub",jwtToken.getSub())
                    .withClaim("room",jwtToken.getRoom())
                    .withClaim("exp",jwtToken.getExp())
                    .withClaim("context",jwtToken.getContext().toString())                                  
                    .sign(getAlgorithm());
        } catch (UnsupportedEncodingException | JWTCreationException ex) {
            throw new JWTCreationException(ex.getMessage(),ex);
        }
    }

用于设置声明“上下文”的 java 代码是错误的。我必须如何使用java api来完成这个?

问候。

标签: jwtauth0jitsi-meet

解决方案


推荐阅读