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

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 都会被拦截判断的问题

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

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

到此这篇关于详解OAuth2 Token 一定要放在请求头中吗的文章就介绍到这了,更多相关OAuth2 Token 请求头内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于SpringBoot整合oauth2实现token认证

    这篇文章主要介绍了基于SpringBoot整合oauth2实现token 认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 session和token的区别: session是空间换时间,而token是时间换空间.session占用空间,但是可以管理过期时间,token管理部了过期时间,但是不占用空间. sessionId失效问题和token内包含. session基于cookie,app请求并没有cookie . token更加安全(每次请

  • Spring Security OAuth2 token权限隔离实例解析

    这篇文章主要介绍了Spring Security OAuth2 token权限隔离实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 由于项目OAuth2采用了多种模式,授权码模式为第三方系统接入,密码模式用于用户登录,Client模式用于服务间调用, 所有不同的模式下的token需要用 @PreAuthorize("hasAuthority('client')") 进行隔离,遇到问题一直验证不通过. 通过调试发现资源服务从授权服

  • 详解OAuth2 Token 一定要放在请求头中吗

    Token 一定要放在请求头中吗? 答案肯定是否定的,本文将从源码的角度来分享一下 spring security oauth2 的解析过程,及其扩展点的应用场景. Token 解析过程说明 当我们使用 spring security oauth2 时, 一般情况下需要把认证中心申请的 token 放在请求头中请求目标接口,如下图 ① spring security oauth2 通过拦截器获取此 token 完成令牌到当前用户信息(UserDetails)的转换. OAuth2Authenti

  • 实例详解jQuery Mockjax 插件模拟 Ajax 请求

    1. 原理 jquery-mockjax是用于mock 前台ajax向后台请求的返回数据. 原理很简单 在你js代码要发送ajax请求的地方断点一下,然后比较在[引入jquery-mockjax] 和 [没有引入jquery-mockjax]的情况下$.ajax.toString()的值情况. 很明显,引入jquery-mockjax时,这个mock库会对jquery提供的ajax函数做替换.这样就很容易能mock起来. 在实际的开发过程中,前端后台协商好了统一的接口,就各自开始自己的任务了.这

  • 详解javascript如何在跨域请求中携带cookie

    目录 1.搭建环境 2.测试同源cookie 3.跨域请求携带cookie 4.总结 5.知识点 1. 搭建环境 1.生成工程文件 npm init 2.安装 express npm i express --save 3.新增app1.js,开启服务器1 端口:3001 const express = require('express') const app = express() const port = 3001 // 设置`cookie` app.get("/login", (r

  • 详解Go语言中Get/Post请求测试

    目录 gin安装 Get请求测试 Post请求测试 基础语法差不多了,需要开始实践到一下项目,先来web框架gin吧,做一个后端web服务. 在把项目搭建起来的过程中,我也要结合实际的工作经验,补充一些项目结构.开发组件上的理解. 项目地址:github地址 gin安装 先将gin安装一下,安装依赖go语言还是比较方便的. 在安装之前先配置一下goproxy. 命令如下: go env -w GO111MODULE=on go env -w GOPROXY=https://mirrors.ali

  • 详解Nginx的配置函数对于请求体的读取

    nginx核心本身不会主动读取请求体,这个工作是交给请求处理阶段的模块来做,但是nginx核心提供了ngx_http_read_client_request_body()接口来读取请求体,另外还提供了一个丢弃请求体的接口-ngx_http_discard_request_body(),在请求执行的各个阶段中,任何一个阶段的模块如果对请求体感兴趣或者希望丢掉客户端发过来的请求体,可以分别调用这两个接口来完成.这两个接口是nginx核心提供的处理请求体的标准接口,如果希望配置文件中一些请求体相关的指

  • 详解用Python爬虫获取百度企业信用中企业基本信息

    一.背景 希望根据企业名称查询其经纬度,所在的省份.城市等信息.直接将企业名称传给百度地图提供的API,得到的经纬度是非常不准确的,因此希望获取企业完整的地理位置,这样传给API后结果会更加准确. 百度企业信用提供了企业基本信息查询的功能.希望通过Python爬虫获取企业基本信息.目前已基本实现了这一需求. 本文最后会提供具体的代码.代码仅供学习参考,希望不要恶意爬取数据! 二.分析 以苏宁为例.输入"江苏苏宁"后,查询结果如下: 经过分析,这里列示的企业信息是用JavaScript动

  • 详解如何在ASP.NET Core Web API中以三种方式返回数据

    在 ASP.NET Core 中有三种返回 数据 和 HTTP状态码 的方式,最简单的就是直接返回指定的类型实例,如下代码所示: [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { [HttpGet] public IEnumerable<WeatherForecast> Get() { var rng = new Random()

  • 详解如何愉快的在微信小程序中使用SVG图标

    SVG近几年因各种优势被大量的应用,遗憾的是到目前为止微信小程序并不支持以XML的形式使用SVG,这使得SVG的灵活性大大下降,大多数人选择放弃在微信小程序中使用SVG图标方案. 那么,真的就没有办法在微信小程序中愉快的使用SVG图标了吗?我们先来分析一下,对于使用SVG图标我们有哪些需求: 能够引入使用 能够调整颜色 首先第一点是没有问题的,微信小程序支持以Image.src的形式引入SVG.接下来就是本文的重点部分了,如何让使Image形式的SVG可以改变颜色. 在最近对CSS的学习中,我发

  • 详解PHP如何在两个大文件中找出相同记录

    目录 1.引言 2.思路 3.实操 4.生成测试文件 5.分割文件 6.查找重复记录 7.完整代码 1.引言 给定a,b两个文件, 分别有x,y行数据, 其中(x, y均大于10亿), 机器内存限制100M,该如何找出其中相同的记录? 2.思路 处理该问题的困难主要是无法将这海量数据一次性读进内存中. 一次性读不进内存中,那么是否可以考虑多次呢?如果可以,那么多次读入要怎么计算相同的值呢? 我们可以用分治思想, 大而化小.相同字符串的值hash过后是相等的, 那么我们可以考虑使用hash取模,

  • 判断请求头中是否含有某属性来判断是否是ajax请求

    复制代码 代码如下: <html> <head> <script language="javascript"> function cl() { var xmlhttp; if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } else { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open(&

随机推荐