【问题标题】:Decoding JWT payload in front end?在前端解码 JWT 有效负载?
【发布时间】:2018-08-06 07:25:05
【问题描述】:

我正在和我的同学一起为学校做一个项目,并在 Spring Security 中使用 JWT。我们对在前端解码 JWT 有效负载进行了辩论。前端是用 Angular 完成的。 Oauth 端点返回授权响应如下:

{
    "access_token": <access_token>,
    "token_type": <bearer>,
    "expires_in": <time>,
    "scope": <scope>,
    "jti": <jti>
}

据我所知,这是标准反应。争论是我们是否应该修改此响应以使其具有用户名和权限。例如:

{
    ...
    "username": <username>
    "authorities": <authorities>
}

我认为没有必要,因为有效负载已经包含相同的信息。此外,有效载荷只是 base64 编码。因此,它不能/不得包含任何已经设计好的敏感信息。此外,这似乎是一种安全风险,因为 JWT 是不可变的,但我认为根据响应主体对用户角色做出任何假设都是错误的。我可以拦截响应,并在响应到达前端之前愉快地让自己成为管理员,然后我将被引导到管理员视图(当然,由于 JWT,任何进一步的请求都已经无效)。我有一个想法可能会在应用程序中增加一些额外的安全性。这个想法是您不能对授权请求中的用户及其角色做出任何假设。您只需获取 JWT 并使用 JWT 向端点发出单独的“WhoAmI”请求,这将返回用户名和角色。这样,前端可以将这些值与从授权服务器获得的值进行比较,并可以立即检测这些值是否已被篡改。如果我理解正确,那么授权服务器应该这样做 - 它应该委托访问。

非常感谢您对此事的意见。

【问题讨论】:

    标签: angular spring-boot spring-security jwt


    【解决方案1】:

    如果您可以拦截令牌响应,那么您可以拦截“WhoAmI”响应并相应地更新它。我建议使用 https 来减少请求/响应拦截。

    所以基本上我会建议在前端解码令牌。但为了提高安全性,您还可以使用 RS(256, 384, 512) 或 ES(256, 384, 512) 检查令牌的真实性,并在端点上提供公钥。

    在您的 AuthorizationServerConfigurerAdapter 配置中使用 spring 定义 JwtTokenStore、JwtAccessTokenConverter 并设置对令牌密钥的访问权限:

    @Bean
    public JwtAccessTokenConverter tokenEnhancer() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setKeyPair(new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "password".toCharArray()).getKeyPair("jwt"));
        return converter;
    }
    
    @Bean
    public JwtTokenStore tokenStore() {
        return new JwtTokenStore(tokenEnhancer());
    }
    
    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.tokenKeyAccess("isAnonymous() || hasAuthority('ROLE_TRUSTED')")
        .checkTokenAccess("hasAuthority('ROLE_TRUSTED')");
    }
    

    要生成密钥库,请使用 java keytool,例如:

    keytool -genkeypair -alias jwt -keyalg RSA -keypass password -keystore jwt.jks -storepass password
    

    通过此配置,前端可以请求 auth.server.com/oauth/token_key 并验证令牌的真实性。因此,如果有人修改了响应,则令牌将无效。

    【讨论】:

      猜你喜欢
      • 2017-01-06
      • 2020-09-18
      • 2018-06-13
      • 2020-04-12
      • 2018-08-08
      • 2018-03-17
      • 2020-01-07
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多