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

简介:

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


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

Token 解析过程说明

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

1

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

2

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

3

3.重写 BearerTokenExtractor 解决,若请求携带 token 无论接口是否被设置 permitAll 都会被拦截判断的问题

3

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-06-28
本文作者:冷冷zz
本文来自:“掘金”,了解相关信息可以关注“掘金”

相关文章
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
2248 0
|
容器
Unable to create tempDir. java.io.tmpdir is set to /tmp
Unable to create tempDir. java.io.tmpdir is set to /tmp
762 1
|
Linux 关系型数据库 Oracle
rhel7安装oracle数据库软件,compat-libstdc++-33缺失
Missing or Ignored package compat-libstdc++-33-3.2.3
6949 0
|
网络协议 Java
【Java】已解决java.net.UnknownHostException异常
【Java】已解决java.net.UnknownHostException异常
5003 0
|
人工智能 JSON API
|
安全 Java Spring
教程:在Spring Boot应用中集成OAuth 2.0认证
教程:在Spring Boot应用中集成OAuth 2.0认证
|
存储 缓存 算法
Java中的内存管理:理解垃圾回收机制
本文将深入探讨Java中的内存管理,特别是垃圾回收机制。我们将从基本的内存分配开始,逐步解析垃圾回收的原理和过程,以及它对Java应用程序性能的影响。通过实例演示,我们会展示如何在Java中有效地管理和优化内存使用。最后,我们将讨论一些常见的内存泄漏问题及其解决方案。
SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
|
开发工具 git
掌握Git必备:最常用的50个Git命令
掌握Git必备:最常用的50个Git命令
1133 0
|
存储 运维 Serverless
Serverless 使用OOS将http文件转存到对象存储
阿里云OOS提供了一种高效、灵活的解决方案,用于自动化HTTP文件到对象存储的转存。通过OOS,用户可以使用函数计算FC执行Python脚本,直接将文件从HTTP源转移到OSS,无需本地存储或额外ECS实例,降低了成本,提高了效率,并减少了错误。实践步骤包括创建OOS模板并在FC上运行。使用此功能需开通FC服务,创建RAM角色并授权访问OSS。附录中提供了示例模板和Python脚本说明。