Open ID Connect SSO JWT授权认证
文章目录
🍎🍏💜👛🍇🍑🍐🍍🍌🍉🍈🍓⏰👮👮♀🥕🚑🚙🌈📷🎯📧🤡💙💑🗂🏝🌾🏤
SSO Server Client URL
服务器端配置说明文档:
客户端配置说明文档:
- Server(服务器端)
github代码地址:springsecurityoauth2-Server-Makaixuan(分支)
🔗https://github.com/MaKaixuanGitHub/Spring-Security.git
🏠Login用户:
username:zhangsan
password:123456
username:lisi
password:123456
服务器端server地址:
🔗http://localhost:8080
注意:先启动服务器端服务在启动客户端服务
- Client(客户端)
github代码地址:branches_makaixuan(分支)
🔗https://github.com/MaKaixuanGitHub/SpringBootThemeleaf.git
🏠Login用户:
username:admin(暂时不要)
password:1234(暂时不要)
客户端server地址:
🔗http://localhost:8081
SSO简介
什么是SSO
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是比较流行的。
在日常生活中,很多人由于忘记某些网站的登录密码而烦恼,因为大多数用户都要记忆不少于10个用户名和相应密码。为了便于记忆,很多人都在不同的站点使用相同的用户名和密码,虽然这样可以减少负担,但是同时也降低了安全性,而且使用不同的站点同样要进行多次登录。同时,随着信息化飞速发展,大型企业和政府部门等都开始使用电子系统进行办公,而且整个办公系统由多个不同的子系统构成,如办公自动化(OA)系统,财务管理系统,档案管理系统,信息查询系统等。如果每个系统都使用独立的登录和验证机制,那么每天工作人员都要登录不同的系统进行办公。用户登录的频繁操作,降低了员工的工作效率,造成工作成本的浪费。而大量的密码和用户名的记忆时间长了也会出现问题,忘记密码或者混淆密码都会造成很大的麻烦。基于以上原因,为用户提供一个畅通的登录通道变得十分重要。
单点登录(SingleSign-On,SSO)是一种帮助用户快捷访问网络中多个站点的安全通信技术。单点登录系统基于一种安全的通信协议,该协议通过多个系统之间的用户身份信息的交换来实现单点登录。使用单点登录系统时,用户只需要登录一次,就可以访问多个系统,不需要记忆多个口令密码。单点登录使用户可以快速访问网络,从而提高工作效率,同时也能帮助提高系统的安全性。
OpenID Connect
什么是OpenID Connect?
OpenID Connect简称为OIDC,已成为Internet上单点登录和身份管理的通用标准。 它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。
OAuth2.0 只是一个授权协议,它授权第三方应用获取访问某些资源的权限,但是并不会提供任何用户信息。它通常是返回的是调用某些web api所需的access token
OAuth授权流程
OpenID Connect授权流程
OIDC流程
Auth2提供了Access Token来解决授权第三方客户端访问受保护资源的问题;相似的,OIDC在这个基础上提供了ID Token来解决第三方客户端标识用户身份认证的问题。OIDC的核心在于在OAuth2的授权流程中,一并提供用户的身份认证信息(ID-Token)给到第三方客户端,ID-Token使用JWT格式来包装,得益于JWT(JSON Web Token)的自包含性,紧凑性以及防篡改机制,使得ID-Token可以安全的传递给第三方客户端程序并且容易被验证。应有服务器,在验证ID-Token正确只有,使用Access-Token向UserInfo的接口换取用户的更多的信息。
授权码取得
- 用以下URL会取得授权码,postman测试用
client1:8081
🔗http://localhost:8080/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://localhost:8081/login&scope=all
client2:8082
🔗http://localhost:8080/oauth/authorize?response_type=code&client_id=makaixuan&redirect_uri=http://localhost:8082/login&scope=all
s5Wkrf
授权码用一次就会失效
根据授权码获取服务器端【access_token】令牌
tag①:
🔗http://localhost:8080/oauth/token
grant_type
:授权类型,填写authorization_code
,表示授权码模式code
:授权码,就是刚刚获取的授权码,注意:授权码只使用一次就无效了,需要重新申请client_id
:客户端标识redirect_uri
:申请授权码时的跳转url,一定和申请授权码时用的redirect_uri
一致scope
:授权范围。
认证失败服务端返回 401 Unauthorized
注意:此时无法请求到令牌,访问服务器会报错
令牌刷新机制
拿到服务器端【access_token】令牌进行解析
tag②:
🔗http://localhost:8080/user/getCurrentUser
JWT官网令牌Token解析
🔗https://jwt.io
客户端8082做成
application.yml
# Tomcat端口号
server:
port: 8082
servlet:
session:
cookie:
name: OAUTH2-CLIENT-SESSIONID02
security:
oauth2:
client:
client-id: makaixuan
client-secret: 332211
user-authorization-uri: http://localhost:8080/oauth/authorize
access-token-uri: http://localhost:8080/oauth/token
resource:
jwt:
key-uri: http://localhost:8080/oauth/token_key
application.yml
里以下三个地方需要改:
name: OAUTH2-CLIENT-SESSIONID02
client-id: makaixuan
client-secret: 332211
其他(个人记录用):
Client URL確認(oauth2client01-demo(SSO))
UserController
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 获取当前用户信息
* @param authentication authentication
* @return authentication
*/
@RequestMapping("getCurrentUser")
public Object getCurrentUser(Authentication authentication){
System.out.println("客户端UserController=======>开始");
return authentication;
}
}
test URL
🔗http://localhost:8081/user/getCurrentUser