Spring boot security oauth2 从 cookie 获取 access_token

Posted

技术标签:

【中文标题】Spring boot security oauth2 从 cookie 获取 access_token【英文标题】:Spring boot security oauth2 get access_token from cookie 【发布时间】: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 访问并且更安全。你怎么看? 我不认为这是一个好方法,但你为什么这样做? 【参考方案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。你有没有遇到过这个问题?

以上是关于Spring boot security oauth2 从 cookie 获取 access_token的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security with Boot

spring boot Security 简单使用

Spring Boot Security

如何使用 Spring Security @Secured 注解测试 Spring Boot @WebFluxTest

如何使用 Spring-Boot 播种 Spring-Security

Understand Spring Security Architecture and implement Spring Boot Security