当前位置: 首页 > 知识库问答 >
问题:

用Java为hasura授权生成JWT令牌

暴辰龙
2023-03-14

我们正在使用Spring引导作为后端,仅为auth和生成jwt令牌的其余部分在hasura中处理。

我面临正确生成JWT的问题。

public String generateToken(String email,String role,Long id)  {
        Map<String, Object> claims = new HashMap<>();

        Map<String,Object> claim =new HashMap<>();
        claims.put("x-hasura-user-id",id);
        claims.put("x-hasura-default-role",role);
        claims.put("x-hasura-allowed-roles", new String[]{"job_seeker", "employer", "admin"});

        claim.put("https://hasura.io/jwt/claims",claims);
        System.out.println(claim);
        return doGenerateToken(claim, email);
    }

    private String doGenerateToken(Map<String, Object> claim, String subject) {
        return Jwts.builder().setClaims(claim).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + Long.parseLong(tokenValidity))).signWith(SignatureAlgorithm.HS256, secret).compact();
    }

这是生成jwt令牌作为

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJyb3NhbjEyM0BnbWFpbC5jb20iLCJodHRwczovL2hhc3VyYS5pby9qd3QvY2xhaW1zIjp7IngtaGFzdXJhLWRlZmF1bHQtcm9sZSI6ImFkbWluIiwieC1oYXN1cmEtdXNlci1pZCI6NCwieC1oYXN1cmEtYWxsb3dlZC1yb2xlcyI6WyJqb2Jfc2Vla2VyIiwiZW1wbG95ZXIiLCJhZG1pbiJdfSwiZXhwIjoxNjA5ODU1OTA2LCJpYXQiOjE2MDk4NTExMDZ9.WqJE1xLIsycW92tzFXdq0UHub3qUfQbUvUax9rvks4Q

但它hasura返回无效的签名。在哪里作为在节点

 generateToken: (user: any) => {
    const payload = {
      sub: user.email,
      "https://hasura.io/jwt/claims": {
        "x-hasura-default-role": `${user.role.name}`,
        "x-hasura-user-id": `${user.id}`,
        "x-hasura-allowed-roles": ["job_seeker", "employer", "admin"],
      },
    };
    return jwt.sign(payload, secretkey);
  },

jwt从节点

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJib2hhcmFuaXNjaGFsQGdtYWlsLmNvbSIsImh0dHBzOi8vaGFzdXJhLmlvL2p3dC9jbGFpbXMiOnsieC1oYXN1cmEtZGVmYXVsdC1yb2xlIjoiam9iX3NlZWtlciIsIngtaGFzdXJhLXVzZXItaWQiOiIyNCIsIngtaGFzdXJhLWFsbG93ZWQtcm9sZXMiOlsiam9iX3NlZWtlciIsImVtcGxveWVyIiwiYWRtaW4iXX0sImlhdCI6MTYwOTg1NDEzMX0.8UDrqvRujakGsEtGEAu1XWl5RsFda8HaA_-97vwY62I

使用相同的密钥和算法工作得非常好。对于节点,我使用了jsonwebtoken库。

共有1个答案

宓英哲
2023-03-14

我找到了解决办法。字符串应转换为byte[]:

 private String doGenerateToken(Map<String,Object> header,Map<String, Object> claim, String subject) {
        return Jwts.builder().setHeader(header).setClaims(claim).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + Long.parseLong(tokenValidity))).signWith(SignatureAlgorithm.HS256, secret.getBytes(StandardCharsets.UTF_8)).compact();
    }
 类似资料:
  • 我正在尝试与URL(python客户端)建立websocket连接,该URL需要传入jwt令牌,服务器(在GO中实现)在上侦听该请求,并应该通过解析令牌进行身份验证。 我试着用这部分代码来提出请求- 此请求命中运行此代码以验证此请求的服务器 func ParseFromRequest(req*http.Request,keyFunc-keyFunc)(令牌*令牌,错误){ } 每次,我都会得到“E

  • 我试图按照指南为YAHOO DSP API生成Oauth认证令牌。 Base64编码是一种将二进制数据编码为文本的方式,这样可以轻松无误地通过网络传输。 在此步骤中,您将获取YDN控制台为您生成的客户端ID和客户端密码,并使用base64协议对它们进行编码。你可以使用base64encode.org这样的在线编码服务。 无论您使用哪种服务,请确保CLIENT_ID和CLIENT_SECRET键上不

  • 寻求有关如何进行微服务授权的建议。 我使用spring/spring boot来提供所有的微服务 在使用JWT令牌到达实际微服务之前,我可以通过Spring Cloud网关进行身份验证,但是在授权方面,我不确定如何做到这一点。 我想在内部处理business microservice中每个endpoint的授权。 有没有办法将JWT令牌传递给微服务,或者我需要调用authserver来获取用户中的

  • 我有一个Web api终端,它给我JWT令牌。它不是一个完全授权的服务器。它只是可以生成一个JWT令牌。 现在我有另一个用 aspnet 核心编写的 Web 应用程序。其中在启动中.cs我添加了以下行,以便我可以使用收到的 JWT 令牌进行授权 我也有一个登录表单(在web应用程序中),用户输入用户名和密码,我发送到web api并获得令牌。为了保护web应用程序中的任何控制器,我只使用了[Aut

  • 我正在尝试获取通过角度发送到 php 的授权令牌。我的角度拦截器如下所示 现在如何在php中获取令牌?我试着遵循这个问题的答案。但这也没用。以下是使用上面答案中的代码时的输出。