OAuth2.0 + JWT 实战
OAuth2.0 + JWT 实战
你好,我是悟空。
前言
本文将会带你了解以下内容:
- Spring Security 搭建一套基于 JWT 的 OAuth2.0 的授权体系
OAuth2.0 协议的原理
项目整体结构
三个微服务
- springsecurity-cloud-oauth2-client,用来扮演客户端角色;
- springsecurity-cloud-oauth2-server,用来扮演授权服务器角色;
- springsecurity-cloud-oauth2-userservice,是用户服务,用来扮演资源提供者角色。
五张数据库表
authorities 表:记录账号的权限。
oauth_approvals 表:记录授权批准的状态。
oauth_client_details 表:记录 OAuth 的客户端。
oauth_code 表:记录授权码。
users 表:记录账号,需要我们在后面做初始化。
模拟第三方请求用户授权
http://localhost:8080/oauth/authorize?response_type=code&client_id=wukong&redirect_uri
=http://www.passjava.cn&scope=all
浏览器输入这个链接,会自动跳转到 http://localhost:8080/login,网页显示如下效果。这个页面就是用户授权的页面,类似微信授权页面,不过这里是要求用户输入自己的用户名和密码。
输入用户名:admin,密码:123456。这里用户名其实可以任意写,因为后端是 mock 的一个用户,并没有真正的去数据库查询用户。
然后就会跳转到一个授权页面,要求用户确认是否授权给 wukong 这个第三方访问受保护的资源。
而且权限范围是 all,这里就选择 Approve。
获取授权码 code
点击授权页面下方的 Authorize 按钮,将会跳转到 http://www.passjava.cn,这个网址 url 后面还会携带一个 code 参数,值为 qV13H0,它是后端 OAuth2.0 授权服务器返回的,把这个值拷贝出来,待会我们用它来换取 token。
每次授权都会拿到不同的 code,如下所示:
那么在实际的场景中,这个 code 是谁拿来用的呢?
这个跳转页面其实是第三方的页面,它会从 url 中拿到 code,然后向授权服务器发起换取 token 的请求。
用 code 换取 token
我们用 postman 模拟第三方发起换取 token 的请求。
点击发送按钮,服务端就会返回 token 信息
access_token: 字符串
token_type:token 的类型
expires_in:过期时间,43199 秒,约等于 12 个小时后过期。
scope:
当我们再次发送相同请求,就会提示:
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: qV13H0"
}
说明这个 code 无效,因为在 OAuth2.0 协议中,code 只能使用一次,用掉就作废了,以免 code 被他人盗用。
输错密码演示
我们再重新通过上面的步骤换取一个 code
虽然输错了密码,但是 code 不会被用掉,所以当我们用正确的密码 112233 后,就能正常获取到 token 了,而且这次 code 就会作废了。