基于密码模式的SSO实现简介

228 阅读4分钟

什么是SSO

SSO(Single Sign On,单点登录)是一种身份验证和授权机制,它允许用户使用一组凭据(如用户名和密码)登录到一个IdP(Identity Provider,身份提供者),并在经过身份验证后访问多个关联的应用程序或系统,而无需再次输入凭据。

在传统的身份验证模式中,用户需要为每个应用程序或系统提供独立的凭据进行登录。这对于用户来说可能很繁琐,而且在多个应用程序之间切换时需要记住和管理多个凭据。SSO的目标是解决这个问题,通过引入一个中心身份提供者,用户只需进行一次身份验证,然后就可以无缝地访问其他关联应用程序。

在SSO中,身份提供者通常是一个独立的认证服务器或服务,负责验证用户的身份。一旦用户通过身份验证,身份提供者会颁发一个令牌(称为令牌票据)给用户。这个令牌可以被用户在访问其他关联应用程序时使用,以证明其已经通过身份验证。其他应用程序会依赖于身份提供者来验证令牌的有效性,并授权用户访问相应的资源或功能。

SSO的优点

SSO的优点包括:

  1. 用户友好:用户只需进行一次登录,就可以访问多个应用程序,提供了更好的用户体验。
  2. 提高安全性:由于用户只需输入凭据一次,减少了密码被泄露或遗忘的风险。
  3. 简化管理:管理员可以更轻松地管理用户的凭据和访问权限,减少了重复工作。
  4. 降低开发成本:应用程序可以依赖于身份提供者处理身份验证和授权逻辑,减少了应用程序本身的复杂性和开发工作量。

基于密码模式的SSO实现

这里所说的密码模式,是指Auth 2.0的密码模式(Auth 2.0的完整阅读可以参考 理解OAuth 2.0

相对于授权码模式,密码模式简单了很多。密码模式中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向身份提供者索要授权。

image.png

登录流程

graph TD
用户 --用户名/密码--> 客户端
客户端 --用户名/密码--> IdP
IdP --> 用户数据库
IdP --access_token--> 客户端 
客户端--access_token--> 用户
  1. 用户向客户端发送登录请求,携带用户名/密码信息,此处注意密码加密,避免明文传输
  2. 客户端将用户名/密码透传给身份提供者服务,身份提供者校验密码正确性
  3. 身份提供者生成access_token,返回客户端
  4. 客户端将access_token返回用户

认证流程

graph TD
用户 --带着access_token请求--> 客户端
客户端 --access_token--> IdP
IdP --校验access_token有效性--> IdP
IdP --校验结果--> 客户端 
客户端--根据校验结果决定是否返回结果--> 用户
  1. 用户发起业务请求,请求中通过参数或Authoration方式携带access_token,推荐Authoration方式
  2. 客户端透传access_token到身份提供者进行有效性校验
  3. 身份提供者校验access_token有效性
  4. 身份提供者向客户端返回校验结果
  5. 客户端根据校验结果,决定是返回业务请求结果还是返回Forbiden错误
  6. 用户如果收到Forbiden错误,可以选择重新发起登录流程

以上是基于密码模式的登录和认证流程。

当多个客户端对接同一个身份提供者时,就实现了SSO。

refresh流程

其实身份提供者还可以提供使用refresh_token的续期access_token流程:

在登录后返回的access_token时,还可以同时返回refresh_token,这样用户可以根据需要拿着refresh_token来请求access_token的续期。

密码模式局限性

在密码模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是企业产品的一部分。如果客户端不是高度可信任的,请勿使用该模式实现,建议使用授权码模式。