SAS-Geting-Start-Index
- spring-authorization-server Github
- spring-authorization-server Document
- 教程源码 Gitee
- 教程源码 Github
- 教程专栏 掘金
- Spring Authorization Server入门 (一) 初识SpringAuthorizationServer和OAuth2.1协议
- Spring Authorization Server入门 (二) Spring Boot整合Spring Authorization Server
- Spring Authorization Server入门 (三) 集成流程说明、细节补充和各种方式获取token测试
- Spring Authorization Server入门 (四) 自定义设备码授权
- Spring Authorization Server入门 (五) 自定义异常响应配置
- Spring Authorization Server入门 (六) 自定义JWT中携带的Claims与资源服务JWT解析器
- Spring Authorization Server入门 (七) 登录添加图形验证码
- Spring Authorization Server入门 (八) Spring Boot引入Security OAuth2 Client对接认证服务
- Spring Authorization Server入门 (九) Spring Boot引入Resource Server对接认证服务
- Spring Authorization Server入门 (十) 添加短信验证码方式登录
- Spring Authorization Server入门 (十一) 自定义grant_type(短信认证登录)获取token
- Spring Authorization Server入门 (十二) 实现授权码模式使用前后端分离的登录页面
- Spring Authorization Server入门 (十三) 实现联合身份认证,集成Github与Gitee的OAuth 登录
- Spring Authorization Server入门 (十四) 联合身份认证添加微信登录
- Spring Authorization Server入门 (十五) 分离授权确认与设备码校验页面
- Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务
- Spring Authorization Server入门 (十七) Vue项目使用授权码模式对接认证服务
- Spring Authorization Server入门 (十八) Vue项目使用PKCE模式对接认证服务
- Spring Authorization Server入门 (十九) 基于Redis的Token、客户端信息和授权确认信息存储
- Spring Authorization Server入门 (二十) 实现二维码扫码登录
- Spring Authorization Server优化篇:自定义UserDetailsService实现从数据库获取用户信息
- Spring Authorization Server优化篇:添加Redis缓存支持和统一响应类
- Spring Authorization Server优化篇:持久化JWKSource,解决重启后无法解析AccessToken问题
- Spring Authorization Server优化篇:Redis值序列化器添加Jackson Mixin,解决Redis反序列化失败问题
- Spring Authorization Server常见问题解答(FAQ)
OAuth2、OpenID、SMAL 对比
| 对比点 | OAuth2.0 | OpenID | SMAL2 |
|---|---|---|---|
| 票据格式 | JSON or SAML2 | JSON | XML |
| 支持授权 | Yes | Yes | Yes |
| 支持认证 | “伪认证” | Yes | Yes |
| 创建年份 | 2005 | 2006 | 2001 |
| 最新版本 | OAuth2 | OpenID Connect | SAML 2.0 |
| 传输方式 | HTTP | HTTP GET and HTTP POST | HTTP重定向,SAML SOAP绑定,HTTP POST绑定等 |
| 安全弱点 | 不能抵抗网络钓鱼,OAuth没有使用数据签名和加密等措施,数据安全完全依赖TLS | 不能抵抗网络钓鱼,一个钓鱼的IDP如果恶意记录下来用户的OpenID,将会造成很严重的隐私安全问题 | XML签名存在漏洞,可能被伪造 |
| 使用场景 | API 授权 | 商用应用的单点登录 | 企业级单点登录,但是对于移动端支持不是很好 |
集成第三方登录
- 微信开放平台
- 微信官方文档
- 企业微信开放平台
- 企业微信官方文档
- 钉钉开放平台
- 钉钉官方文档
- Gitee 开发者平台
- Gitee 官方文档
- 微博开放平台
- 微博官方文档
- Google APIs
- Google 官方文档
- Facebook 开发者平台
- Facebook 官方文档
- Github 开发者平台
- Github 官方文档
项目开发环境说明
认证服务
开发软件
| 软件 | 版本 |
|---|---|
| Java | 17 |
| Maven | 3.6.3 |
| MySQL | 5.7.17 |
| Redis | 5.0.14 |
| IntelliJ IDEA | 2023.1.3 |
| Navicat | 16 |
框架版本
| 框架 | 版本号 |
|---|---|
| Spring Boot | 3.1.0 |
| Spring Security | 6.1.0 |
| Spring OAuth2 Authorization Server | 1.1.0 |
| Spring OAuth2 Client | 6.1.0 |
| Spring OAuth2 Resource Server | 6.1.0 |
| Mybatis Plus | 3.5.3.1 |
| hutool | 5.8.18 |
前端项目
开发软件
| 软件 | 版本 |
|---|---|
| NodeJs | v14.18.2 |
| @vue/cli | 5.0.8 |
| npm | 9.6.5 |
| VS Code | 1.81.1 |
框架版本
| 框架 | 版本 |
|---|---|
| vue | ^3.3.4 |
| vue-router | ^4.2.4 |
| vite | ^4.3.9 |
| axios | ^1.4.0 |
| naive-ui | ^2.34.4 |
| crypto-js | ^4.1.1 |
| typescript | ~5.0.4 |
本地开发指南
后端
初始化环境
- 从代码仓库拉取代码
git clone https://gitee.com/vains-Sofia/authorization-example.git
-
idea导入项目,配置maven、jdk,等待maven下载完依赖
-
目前项目中依赖的客户端信息、授权信息和授权确认信息都是基于Redis的,必须的客户端信息在项目启动时会自动初始化,如果需要自定义可以在
./authorization-server/src/main/java/com/example/repository/RedisRegisteredClientRepository.java中查看initClients方法并自定义初始化内容。 -
在MySQL数据库中创建数据库
authorization-example,导入./authorization-server/sql/authorization-example-rbac.sql和./authorization-server/sql/oauth2_third_account.sqlSQL文件,初始化RBAC所需数据库表和三方登录用户信息表。
修改配置
-
修改认证服务配置文件
authorization-server/src/main/resources/application.yml,将地址、客户端信息等改为自己的 -
修改
spring.security.oauth2.client.registration.gitee.client-id配置,将 此配置修改为自己在gitee注册的三方登录应用client id。 -
修改
spring.security.oauth2.client.registration.gitee.client-secret配置,将此配置修改为自己在gitee注册的三方登录应用的client secret。 -
在
gitee中添加三方登录应用的回调地址:http://127.0.0.1:8080/login/oauth2/code/gitee,否则在使用gitee登录时会发起授权申请失败。 -
修改
spring.security.oauth2.client.registration.github.client-id配置,将此配置修改为自己在github注册的OAuth App的client id。 -
修改
spring.security.oauth2.client.registration.github.client-secret配置,将此配置修改为自己在github注册的OAuth App的client secret。 -
在
github中添加OAuth App的回调地址:http://127.0.0.1:8080/login/oauth2/code/github,否则在使用github登录时会发起授权申请失败。 -
修改
spring.security.oauth2.client.registration.wechat.client-id配置,将此配置修改为自己在微信公众平台申请的测试号的client id。 -
修改
spring.security.oauth2.client.registration.wechat.client-secret配置,将此配置修改为自己在微信公众平台申请的测试号的client secret。 -
在微信公众平台的测试号管理中配置回调域名,入口在 [网页授权获取用户基本信息] 后的 [修改] 按钮:
127.0.0.1:8080,否则在使用wechat登录时会发起授权申请失败。 -
修改认证服务自定义配置
custom.scurity下的相关配置- 修改
login-url、consent-page-uri、device-activate-uri和device-activated-uri的域名全部改为http://127.0.0.1:5173,如下所示 - 修改
issuer-url为http://127.0.0.1:8080
- 修改
custom:
# 自定义认证配置
security:
# 登录页面路径
login-url: http://127.0.0.1:5173/login
# 授权确认页面路径
consent-page-uri: http://127.0.0.1:5173/consent
# 设备码验证页面
device-activate-uri: http://127.0.0.1:5173/activate
# 设备码验证成功页面
device-activated-uri: http://127.0.0.1:5173/activated
- 修改
server.servlet.session.cookie.domain配置为127.0.0.1
完整配置展示,可自己决定配置,但是建议先按示例跑起来后再修改
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/authorization-example?serverTimezone=Asia/Shanghai&userUnicode=true&characterEncoding=utf-8&ssl-mode=REQUIRED
username: ${DB_USER:root}
password: ${DB_PASSWORD:root}
security:
oauth2:
client:
registration:
# 这个'gitee'就是registrationId
gitee:
# 指定oauth登录提供者,该oauth登录由provider中的gitee来处理
provider: gitee
# 客户端名字
client-name: Sign in with Gitee
# 认证方式
authorization-grant-type: authorization_code
# 客户端id,使用自己的gitee的客户端id
client-id: dd8de6dfa9674cc307e18ca75616a0ded06126ddc4f95098da36e1fbfa141d0a
# 客户端秘钥,使用自己的gitee的客户端秘钥
client-secret: 59b069e525b84cac8fcb854148b623743eefd6bbe9d54433c006ec0c2f785c4d
# 回调地址
redirect-uri: ${custom.security.issuer-url}/login/oauth2/code/gitee
# 申请scope列表
scope:
- emails
- projects
github:
# security client默认实现了GitHub提供的oauth2登录
provider: github
client-id: 88c69e87b2e50d2dab4d
client-secret: 350b351e8287fc142d01082bcf0dc5c6df7c21ae
# 回调地址
redirect-uri: ${custom.security.issuer-url}/login/oauth2/code/github
wechat:
# 微信登录配置
provider: wechat
# 客户端名字
client-name: Sign in with WeChat
# 认证方式
authorization-grant-type: authorization_code
# 客户端id,使用自己的微信的appid
client-id: wx946ad2f955901214
# 客户端秘钥,使用自己的微信的app secret
client-secret: e4635ff2ed22c83294394ac818cf75a7
# 回调地址
redirect-uri: ${custom.security.issuer-url}/login/oauth2/code/wechat
# 申请scope列表
scope: snsapi_userinfo
# oauth登录提供商
provider:
# 微信的OAuth2端点配置
wechat:
# 设置用户信息响应体中账号的字段
user-name-attribute: nickname
# 获取token的地址
token-uri: https://api.weixin.qq.com/sns/oauth2/access_token
# 获取用户信息的地址
user-info-uri: https://api.weixin.qq.com/sns/userinfo
# 发起授权申请的地址
authorization-uri: https://open.weixin.qq.com/connect/oauth2/authorize
# gitee的OAuth2端点配置
gitee:
# 设置用户信息响应体中账号的字段
user-name-attribute: login
# 获取token的地址
token-uri: https://gitee.com/oauth/token
# 获取用户信息的地址
user-info-uri: https://gitee.com/api/v5/user
# 发起授权申请的地址
authorization-uri: https://gitee.com/oauth/authorize
github:
user-name-attribute: login
jackson:
default-property-inclusion: non_null
data:
redis:
url: ${REDIS_URL:redis://127.0.0.1:6379}
# Mybatis-Plus 配置
mybatis-plus:
# 扫描mapper文件
mapper-locations:
- classpath:com/example/mapper/xml/*Mapper.xml
custom:
# 自定义认证配置
security:
# 登录页面路径
login-url: http://127.0.0.1:5173/login
# 授权确认页面路径
consent-page-uri: http://127.0.0.1:5173/consent
# 设备码验证页面
device-activate-uri: http://127.0.0.1:5173/activate
# 设备码验证成功页面
device-activated-uri: http://127.0.0.1:5173/activated
# 不需要认证的地址
ignore-uri-list: assets/**, /webjars/**, /login, /getCaptcha, /getSmsCaptcha, /error, /oauth2/consent/parameters, /test03, /favicon.ico, /qrCode/login/**
# 当前认证服务访问的路径
issuer-url: http://127.0.0.1:8080
server:
servlet:
session:
cookie:
domain: 127.0.0.1
修改完成后即可启动认证服务了。
前端
初始化环境
-
修改
./vue-login-page-example/.env.dev文件,修改VITE_OAUTH_CLIENT_ID属性为messaging-client,仓库代码中是匿名token的客户端,这一步是可选的。 -
在
./vue-login-page-example/文件夹下打开cmd命令窗口。 -
执行
npm install命令安装依赖。 -
依赖安装完成后执行
npm run dev命令。 -
浏览器打开
http://127.0.0.1:5173即可看到与示例项目一致的页面。
部署指南
认证服务Docker部署
- 从代码仓库拉取代码
git clone https://gitee.com/vains-Sofia/authorization-example.git
-
目前项目中依赖的客户端信息、授权信息和授权确认信息都是基于Redis的,必须的客户端信息在项目启动时会自动初始化,如果需要自定义可以在
./authorization-server/src/main/java/com/example/repository/RedisRegisteredClientRepository.java中查看initClients方法并自定义初始化内容。 -
在MySQL数据库中创建数据库
authorization-example,导入./authorization-server/sql/authorization-example-rbac.sql和./authorization-server/sql/oauth2_third_account.sqlSQL文件,初始化RBAC所需数据库表和三方登录用户信息表。 -
在认证服务根目录(Dockerfile所在目录)执行docker通过Dockerfile文件打包镜像命令
docker build -t authorization-server:1.0 .
- 执行容器制作命令,自动启动
docker run -d -v /usr/local/docker-temp/application/application.yml:/application/BOOT-INF/classes/application.yml --restart=always --name authorization-server --privileged=true -p 5000:5000 authorization-server:1.0