Spring Authorization Server 系列(二)获取授权码
- 概述
- 获取授权码
- 获取授权码的url
- 逻辑解析
- 匹配url
- 参数解析
- 三级目录
概述
Spring Authorization Server 是基于 OAuth2.1 和 OIDC 1.0 的。
只有 授权码,刷新token,客户端模式。
获取授权码
用过Spring Security 的都知道,ta是基于一系列 Filter 实现其功能的,Spring Authorization Server 以及之前的 Spring Security OAuth解决方案也是如此。
通过查看API 知道,获取授权码的Filter为 OAuth2AuthorizationEndpointFilter
OAuth2的流程这里不赘述,下面开始解析 OAuth2AuthorizationEndpointFilter
获取授权码的url
查看源码,可以看到,这个filter默认匹配的url是 /oauth2/authorize
授权url
http://localhost:9000/oauth2/authorize?client_id=messaging-client&response_type=code&scope=openid+profile&state=xzy&redirect_uri=http://www.baidu.com
逻辑解析
匹配url
这是入口,如果当前请求匹配不上,则跳过此Filter
第一步 GET 请求 /oauth2/authorize,只要url和请求方式匹配即可
参数解析
一旦匹配上,接下来会进行参数解析;
-
解析get请求参数(包括首次的授权请求和登录成功后重定向第二次授权请求);这里可以发现一个点,用户认证的Filter在OAuth2的Filter之前,对于未认证的请求,OAuth2的Filter会将其重定向到登录页
通过debug可以发现,解析GET请求参数的 converter为 OAuth2AuthorizationCodeRequestAuthenticationConverter- response_type
必须,且只能有一个 - client_id
必须,且只能有一个 - 当前认证上下文,如果已经认证,则取出认证结果,否则设置为匿名认证
- redirect_uri
可选,最多一个 - scope
可选,最多一个
但这个参数,要注意,它和其他参数有点不一样,如果有值,还会进一步处理
这个参数会以空格为点,进行拆分,形成一个集合
这里又牵出了一个基础知识,我们知道在url中的一些特殊符号是不能直接使用的;涉及到url编码的一些问题。
对于scope的值,如果要传多个,可以使用 + 或者 空格(%20) 隔开。 - state
state是一个可选,但是推荐使用的参数。主要用于客户端确保 OAuth2.x 中回调那一步时,是真正的授权服务器回调给自己。
使用方式为:在开始请求授权时,客户端传给授权服务器的一个随机字符串,然后授权服务器回调时,会原封不动将这个参数传给客户端,此时,客户端可以比较这两个值是否一致,只有一致时,表示这个回调来自真实的授权服务器,这个授权码是可信的 - code_challenge && code_challenge_method
这俩是后面新加的参数,对于一般的OAuth2授权流程是不需要的。
ta主要是针对公共客户端的授权,一般指前端应用,不方便存储密钥的客户端。
目的:用于授权服务器确定,使用获取code和换取token的同一个客户端。
使用方式:
1. 本地生成一个随机字符串 code_verifier,使用 code_challenge_method算法,得到 一个 **code_challenge **
2. 请求授权码时,将这两个值,都传给授权服务器,授权服务器会保存两个值 code_challenge_method code_challenge
3. - response_type
第二步,Spring Security 会重定向到登录页,登录成功后,会再次重定向到请求授权页,此时还是 GET 请求