跳至主要內容

OAuth2.0 + JWT 实战

悟空约 723 字大约 2 分钟...

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,网页显示如下效果。这个页面就是用户授权的页面,类似微信授权页面,不过这里是要求用户输入自己的用户名和密码。open in new window

image-20220914212129910
image-20220914212129910

输入用户名:admin,密码:123456。这里用户名其实可以任意写,因为后端是 mock 的一个用户,并没有真正的去数据库查询用户。

然后就会跳转到一个授权页面,要求用户确认是否授权给 wukong 这个第三方访问受保护的资源。

而且权限范围是 all,这里就选择 Approve。

image-20220914212230080
image-20220914212230080

获取授权码 code

点击授权页面下方的 Authorize 按钮,将会跳转到 http://www.passjava.cnopen in new window,这个网址 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 就会作废了。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.3.0