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 @Secured 注解测试 Spring Boot @WebFluxTest
如何使用 Spring-Boot 播种 Spring-Security
Understand Spring Security Architecture and implement Spring Boot Security