【问题标题】:Spring boot security oauth2 get access_token from cookieSpring boot security oauth2 从 cookie 获取 access_token
【发布时间】:2018-07-04 19:43:48
【问题描述】:

我目前正在几个 Spring Boot 应用程序之间实现身份验证。目前,jwt 访问令牌在授权标头中发送,并由资源服务器获取。但是我想使用 HttpOnly cookie 来发送令牌,并且想知道如何配置 Spring Boot 以从 cookie 而不是标头获取令牌。

我应该提到我正在使用 spring-security-oauth2 和 spring-security-jwt 库。

谢谢!

【问题讨论】:

  • 嗨,我对 Spring Boot 框架还很陌生,所以说实话我真的不知道从哪里开始 :)。我已经设置了一个配置类(按照教程),它配置了 httpSecurit 和 tokenServices。但我不知道在什么时候从请求中提取了令牌。
  • 为什么要使用cookie而不是HTTP Authorization header(bearer)?您可能只想通过 API 调用发送令牌,而不是每个请求(cookie)。
  • 我一直在阅读有关 JWT 令牌的文章,其中大多数建议将令牌存储在 httpOnly cookie 中,因为它无法通过 js 访问并且更安全。你怎么看?
  • 我不认为这是一个好方法,但你为什么这样做?

标签: java spring cookies oauth-2.0 spring-security-oauth2


【解决方案1】:

通过创建我的自定义 TokenExtractor 并将其传递到配置类(带有 @EnableResourceServer 的类)中,设法从 cookie 中获取令牌,如下所示:

public void configure(ResourceServerSecurityConfigurer resources) {
    resources.tokenExtractor(new CustomTokenExtractor());
}

【讨论】:

  • 当我设置TokenExtractor 时,我不断收到CORS Error。你有没有遇到过这个问题?
【解决方案2】:

接受的答案中的 CustomExtractor 可能如下所示:

private class CustomExtractor implements TokenExtractor {
    private static final String TOKEN_KEY_JWT = "token";

    @Override
    public Authentication extract(HttpServletRequest request) {
        return new PreAuthenticatedAuthenticationToken(getTokenFromRequest(request), "");
    }

    private String getTokenFromRequest(HttpServletRequest request) {
        final Cookie[] cookies = request.getCookies();
        if (cookies == null) {
            return null;
        }
        return Arrays.stream(cookies)
                     .filter(cookie -> cookie.getName().equals(TOKEN_KEY_JWT))
                     .findFirst()
                     .map(Cookie::getValue).orElse(null);
    }
}

【讨论】:

  • 当我设置TokenExtractor 时,我不断收到CORS Error。你有没有遇到过这个问题?
猜你喜欢
  • 2019-06-03
  • 2012-12-19
  • 2017-09-11
  • 2015-08-10
  • 2020-07-07
  • 1970-01-01
  • 2017-08-01
  • 2013-04-17
  • 2017-10-02
相关资源
最近更新 更多