OAuth2 单点登录
简介:OAuth(Open Authorization)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用。OAuth2是OAuth协议的延续版本,OAuth1已经被废弃,现在OAuth2是用于授权的行业标准协议。
1. 四个角色
A. 客户端(Client):本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如浏览器或服务器API服务;
B. 资源拥有者(Resource Owner):通常为用户,也可以是应用程序,他有访问资源的账号和秘钥;
C. 认证服务器(Authorization Server):用于服务提供商对资源拥有的身份进行认证、对访问资源进行授权,认证成功后会给客户端发放令牌access_token
,作为客户端访问资源服务器的凭据;
D. 资源服务器(Resource Server):拥有受保护的资源,如果请求包含正确的令牌,那就可以访问资源,比如提供客户端API的服务。
注意:服务提供商给接入方的身份凭据是:client_id(客户端标识) + client_secret(客户端秘钥),用于不能随便一个请求就能认证授权。
2. 运行流程
A. 客户端请求第三方授权;
B. 资源拥有者同意给客户端授权;
C. 客户端获取到授权码,请求认证服务器申请令牌;
D. 认证服务器认证授权码无误,同意向客户端发放令牌;
E. 客户端使用令牌请求资源服务器的资源;
F. 资源服务器认证令牌无误,同意开放受保护的资源。
3. 授权模式
A. 授权码模式(Authorization Code)
流程:
第一步:用户访问客户端,将会跳转到授权服务器;
第二步:用户给予是否给客户端授权;
第三步:若授权的话,授权服务器将跳转到客户端指定的URI,并同时提供授权码;
第四步:客户端收到授权码,通过返回的URI,向认证服务器申请令牌;
第五步:认证服务器比对授权码和重定向URI,认证无误后,向客户端发送访问令牌和更新令牌。
使用场景:该模式是OAuth2最安全最完善的一种模式,可以实现服务之间的调用,比如微信,QQ等第三方登录。
B. 密码模式(Password)
流程:
第一步:将用户名和密码提供给客户端;
第二步:客户端携带用户名和密码发送给认证服务器申请令牌;
第三步:认证服务器认证无误,向客户端提供访问令牌。
使用场景:客户端不得存储密码,通常用在用户对客户端高度信任情况下。
C. 简化模式(Implicit)
D. 客户端模式(Client Credentials)
流程:
第一步:客户端(服务,非用户)向认证服务器进行身份验证,申请令牌;
第二部:认证服务器认证无误,向客户端提供访问令牌。
使用场景:A服务本身需要B服务资源,与用户无关。
4. sql语句
-- used in tests that use HSQL create table oauth_client_details ( client_id VARCHAR(256) PRIMARY KEY, resource_ids VARCHAR(256), client_secret VARCHAR(256), scope VARCHAR(256), authorized_grant_types VARCHAR(256), web_server_redirect_uri VARCHAR(256), authorities VARCHAR(256), access_token_validity INTEGER, refresh_token_validity INTEGER, additional_information VARCHAR(4096), autoapprove VARCHAR(256) ); create table oauth_client_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication_id VARCHAR(256) PRIMARY KEY, user_name VARCHAR(256), client_id VARCHAR(256) ); create table oauth_access_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication_id VARCHAR(256) PRIMARY KEY, user_name VARCHAR(256), client_id VARCHAR(256), authentication LONGVARBINARY, refresh_token VARCHAR(256) ); create table oauth_refresh_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication LONGVARBINARY ); create table oauth_code ( code VARCHAR(256), authentication LONGVARBINARY ); create table oauth_approvals ( userId VARCHAR(256), clientId VARCHAR(256), scope VARCHAR(256), status VARCHAR(10), expiresAt TIMESTAMP, lastModifiedAt TIMESTAMP ); -- customized oauth_client_details table create table ClientDetails ( appId VARCHAR(256) PRIMARY KEY, resourceIds VARCHAR(256), appSecret VARCHAR(256), scope VARCHAR(256), grantTypes VARCHAR(256), redirectUrl VARCHAR(256), authorities VARCHAR(256), access_token_validity INTEGER, refresh_token_validity INTEGER, additionalInformation VARCHAR(4096), autoApproveScopes VARCHAR(256) );
可参考:OAuth2四种认证模式概念理解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗