Oauth2.0学习
oauth2 学习
准备工作 :
如果是通过数据库进行授权,需在oauth2 的客户端配置表(oauth_client_details
)中配置相关信息 :
设置信息如下 :
客户端编号(client_id
) 为 client
;
资源编号(resource_ids
) 为 *
(全部资源);
客户端的访问密匙(Client Secret
) 为 123456
(该值需要加密存储);
客户端申请的权限范围(scope
) 为 read
(可设置为 read|只读、write|只写、trust);
客户端支持的授权类型(authorized_grant_types
)为client_credentials|客户端凭证,implicit|隐藏式,authorization_code|授权码,refresh_token|可刷新,password密码式
;
客户端访问的资源地址(web_server_redirect_uri
)为 http://127.0.0.1
;
指定spring security的用户(authorities
)为 *
所有用户都能访问.
如果是直接在内存中存储,需在oauth2 的配置项中直接设置,如下:
1 |
|
1、 授权码(authorization-code)
1.1、获取配置的请求地址的授权码:
浏览器访问如下地址 :
1 | http://localhost:8823/oauth/authorize?response_type=code&client_id=client&scope=read&redirect_uri=http://127.0.0.1 |
提示 如下信息 :
选中 Approve
选项
点击 Authorize
按钮 , 系统会响应一会儿 得到如下信息:
得到的地址 后的 code=7GLfrX
就是当前的授权码信息
1.2、通过 code
授权码 获取token
信息:
在 PostMan
工具上 创建如下 POST
请求 :
1 | http://localhost:8823/oauth/token?grant_type=authorization_code&code=7GLfrX&client_id=client&client_secret=123456&redirect_uri=http://127.0.0.1 |
得到如下 信息 :
1 | { |
之后使用 access_token
的token值访问资源就行
2、隐藏式(implicit)
在 浏览器地址栏输入如下请求 :
1 | http://localhost:8823/oauth/authorize?response_type=token&client_id=client&redirect_uri=http://127.0.0.1 |
需要用户登录之后得到进入如下页面
设置客户端client
的访问权限,这里设置read
和 write
都是Approve
点击 Authorize
按钮 , 系统会响应一会儿 得到如下信息:
得到的信息 :
1 | http://127.0.0.1/#access_token=0820dc62-ae1a-4186-b27c-aea060529631&token_type=bearer&expires_in=1200000&scope=read%20write |
之后使用 access_token
的token值访问资源就行
3、密码式(password)
在 PostMan
工具上 创建如下 POST
请求 :
1 | http://localhost:8823/oauth/token?grant_type=password&client_id=client&client_secret=123456&username=oauth_admin&password=user |
得到如下 信息 :
1 | { |
之后使用 access_token
的token值访问资源就行
4、客户端凭证(client credentials)
在PostMan
上创建如下 POST
请求 :
1 | http://localhost:8823/oauth/token?grant_type=client_credentials&scope=read&client_id=client&client_secret=123456 |
得到如下信息 :
1 | { |
之后使用 access_token
的token值访问资源就行
5、刷新 token信息 ( refresh token )
一般来说,refresh_token
的有效期会比 access_token
的有效期稍长,在 access_token
失效后,
可通过如下 POST
请求刷新token信息 :
1 | http://localhost:8823/oauth/token?grant_type=refresh_token&refresh_token=f8dc8c19-6b0f-459c-aee0-8dc1677ec66e&client_id=client&client_secret=123456 |
得到的信息如下 :
1 | { |
可以发现,刷新过后的token 得到的 refresh_token
并没有改变,仍然是 f8dc8c19-6b0f-459c-aee0-8dc1677ec66e
,因此需要在配置刷新token时 配置 如下信息才能每次生成不同的refresh_token
1 | DefaultTokenServices tokenServices = new DefaultTokenServices(); |
如果需要了解spring boot中oauth2的相关实现源码,idea中查看spring-security-oauth2
包中的OAuth2AuthenticationProcessingFilter
类的相关实现