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

Token 解析过程说明

当我们使用 spring security 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;

}

}

扩展点

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

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

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

oauth2 java 获取token_OAuth2 Token 一定要放在请求头中吗?相关推荐

  1. token放在cookie中和放在请求头中的区别

    token放在cookie中 和 放在请求 头中的区别 cookie中: 防止xss攻击,但是导致所有请求都会携带token 请求头中: 会有xss风险,而且前端需要保存token并在每次请求的时候携 ...

  2. 【接口测试】【postman】postman通过脚本获取Token并自动加入请求头实现Token的参数化

    目录 一  需求背景 二  实现方案 方案1:URL获取Token并手动填写请求头 1.1  通过URL获取Token值 1.2  Headers请求头手动填写Token并发送请求 方案2:脚本获取T ...

  3. mysqls压力测试怎么用_用 Swagger 测试接口,怎么在请求头中携带 Token?

    松哥周末抽空给 Spring Security 系列也录制了一套视频,目录如下: 感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程 今天的话题来自一个小伙伴在微信上的提问 ...

  4. 前后端分离项目,请求头中包含Authorizaton:XX,但是后端getHeader(Authorizaton) 获取不到

    前端请求头 后台校验 结果是 request = null: 原因是因为,在发起跨域请求时,会发送事先发送一个OPTIONS请求,可以在浏览器的NETWORK中看到发起了两个名字一样的请求. 第一个请 ...

  5. Vue:全局拦截所有请求,并在请求头中添加token

    Vue:全局拦截所有请求,并在请求头中添加token 在实际的项目中,为了登录的安全,token是必不可少的,所以就需要前后端配合,后端生成和验证token(这方面我也写过博客,讲述后端对token的 ...

  6. 需要授权的 API ,必须在请求头中使用 Authorization 字段提供 token 令牌

    需要授权的 API ,必须在请求头中使用 添加字段 需要授权的 API ,必须在请求头中使用 Authorization 字段提供 token 令牌 实现方法 通过 axios 请求拦截器添加 tok ...

  7. ajax被token拦截,vue中封装ajax请求,并且拦截请求在请求头中添加token

    /** * 封装请求方法 * @param {Object} url 接口请求地址 * @param {Object} data 接口请求参数(无需请求方式参数,则此项可以为空,否则必须传) * @p ...

  8. axios获取header中的信息_Axios请求头中常见的Content-Type及其使用

    Vue2.0之后,官方不再继续维护vue-resource,尤雨溪大大推荐使用Axios用来替代Ajax. Axios请求头中的Content-Type常见的有3种: 1.Content-Type:a ...

  9. axios请求拦截器在请求头中添加token

    验证用户是否需要登陆,如果需要登陆在请求前在请求头中自动添加token字段. 代码: // request 拦截器 // 可以自请求发送前对请求做一些处理 request.interceptors.r ...

最新文章

  1. html5语义化布局分割代码,HTML5语义化标签布局的兼容性.html
  2. 大数据组件需要额外添加的依赖包汇总(持续更新中)
  3. UVa-12333:Revenge of Fibonacci 高精度
  4. TextField对象相关的属性和方法总结
  5. MySQL 正则表达式
  6. 信创产业已成现象级新风口,快来加入争做“弄潮儿”
  7. python标准库:collections和heapq模块
  8. 【bzoj1050】[HAOI2006]旅行comf 并查集
  9. C++17 Any类
  10. 充电枪cp信号控制板_交流充电桩控制原理
  11. oracle中字符串长度计算,根据 oracle 标准计算超长字符串的长度
  12. 2021-10-07 浊音,清音,爆破音频谱分析
  13. 姓谢起名:温柔贤惠、好听到爆的谢姓女孩名字
  14. 超级好的6款办公软件,你用过几款呢?
  15. k8s可视化管理工具Rancher安装和使用
  16. 大数据毕设 - 深度学习植物识别系统(python OpenCV)
  17. trickle_ice 原理
  18. webRTC(十五):webrtc 文件实时传输
  19. 大数据:数据合集,你想要的或许这里都有
  20. JAVA序列化标准格式(XML、JSON)

热门文章

  1. JavaScript | 用户定义函数的一些示例
  2. tcp 发送 最大数据量_网络基础知识夯实总结(三):TCP协议
  3. 给定一个由n个数字组成的数组,请检查是否存在重复项
  4. c#equals方法源码_C#中的Int32.Equals()方法示例
  5. MySQL 基础模块的面试题总结
  6. 生成文件的另一种思路——共享文件同步
  7. 决定c++语言中函数的返回值类型的是,全国2009年10月高等教育自学考试C++程序设计试题及部分参考答案...
  8. php文件怎么设置隐藏显示代码,php文件隐藏的方法
  9. java通过POI技术将HTML文件转成Word
  10. 哈工大华中科技大学计算机学院官网,我国重点大学排名盘点,哈工大重回前十,北理工只排十四...