OAuth2 Token 一定要放在请求头中吗?

Stella981
• 阅读 970

Token 一定要放在请求头中吗? 答案肯定是否定的,本文将从源码的角度来分享一下 spring security oauth2 的解析过程,及其扩展点的应用场景。

Token 解析过程说明

当我们使用 spring security oauth2 时, 一般情况下需要把认证中心申请的 token 放在请求头中请求目标接口,如下图 ①

OAuth2 Token 一定要放在请求头中吗?

spring security oauth2 通过拦截器获取此 token 完成令牌到当前用户信息(UserDetails)的转换。

  • OAuth2AuthenticationProcessingFilter.doFilter

    public class OAuth2AuthenticationProcessingFilter{ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { try { // 1. 根据用户请求解析令牌,组装预登陆对象 Authentication authentication = tokenExtractor.extract(request); if (authentication == null) { // 若是预登陆状态为空,把无状态登录清空 if (stateless && isAuthenticated()) { SecurityContextHolder.clearContext(); } } else { // 2. 根据token 来做真正的认证登录 Provier Authentication authResult = authenticationManager.authenticate(authentication); // 3. 登录成功逻辑 eventPublisher.publishAuthenticationSuccess(authResult); SecurityContextHolder.getContext().setAuthentication(authResult); } } catch (OAuth2Exception failed) { // 异常通知逻辑 Spring Event ... return; } chain.doFilter(request, response); } }

我们主要来关注第一步 根据用户请求解析令牌,组装预登陆对象

来看默认实现 BearerTokenExtractor

public class BearerTokenExtractor implements TokenExtractor {
    @Override
    public Authentication extract(HttpServletRequest request) {
        // 1. 解析token
        String tokenValue = extractToken(request);
        if (tokenValue != null) {
            // 2. 创建一个authentication 返回
            PreAuthenticatedAuthenticationToken authentication = new PreAuthenticatedAuthenticationToken(tokenValue, "");
            return authentication;
        }
        return null;
    }

    protected String extractToken(HttpServletRequest request) {
        // 1.1 优先从请求header 获取token
        String token = extractHeaderToken(request);
        // 1.2 若是请求token 中没有,则获取请求参数中的 access_token 参数
        if (token == null) {
            token = request.getParameter(OAuth2AccessToken.ACCESS_TOKEN);
        }
        return token;
    }
}

扩展点

    1. 丰富获取 token 渠道,个性化处理.例如掘金的 X-Legacy-Token 而非必须是 Authorization

OAuth2 Token 一定要放在请求头中吗?

    1. 请求参数中携带 access_token 参数也能被正确解析处理

OAuth2 Token 一定要放在请求头中吗?

    1. 重写 BearerTokenExtractor 解决,若请求携带 token 无论接口是否被设置 permitAll 都会被拦截判断的问题 OAuth2 Token 一定要放在请求头中吗?

以上源码参考: 基于 Spring Boot 2.3.0、 Spring Cloud Hoxton & Alibaba、 OAuth2 的 RBAC 权限管理系统 PigBearerTokenExtractor 部分扩展

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
MaxSky MaxSky
3年前
PHP 微信公众号消息加解密
公众号配置根据提示设置即可:【图中信息均为无意义数据,仅供参考。注意服务器地址需可接收GET/POST两种请求】AESKey直接点一下随机生成即可,Token可以生成一个UUID再把UUID进行MD5一次即可。接收关注事件消息示例请求参数校验这一步根据项目情况,可供参考:(Lumen框架)php$valida
Stella981 Stella981
3年前
Spring Cloud OAuth 实现微服务内部Token传递的源码解析
背景分析!(http://pic.pigx.top/20190414113622_whRvQH_havetoken.jpeg)1.客户端携带认证中心发放的token,请求资源服务器A(SpringSecurityOAuth发放Token源码解析(https://my.oschina.net/giegie/blog/
Stella981 Stella981
3年前
Spring Boot REST 风格 API 接口 JWT Token 认证
SpringBootREST风格API接口JWTToken认证需求分析接口认证需求:1能够有选择地过滤没有权限(Token)的请求2Token具有时效性3如果用户连续操作,Token能够自动刷新(自动延长有效期)核心依
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
融云IM即时通讯 融云IM即时通讯
8个月前
为什么客户端不支持获取 Token,为什么一定要在服务端请求 Token?
为什么客户端不支持获取Token,为什么一定要在服务端请求Token?