跳到主要内容

单点登录应该怎么做

什么是单点登录

单点登录(Single Sign-On,SSO)是一种身份认证和授权的机制,允许用户在多个应用程序或系统之间使用一组凭据(例如用户名和密码)进行一次登录,然后可以无需重复登录即可访问其他应用程序。

单点登录的实现步骤

下面是一个基本的单点登录的实现步骤:

  1. 中心身份提供者(Identity Provider,IdP):建立一个中心的身份提供者,负责用户身份验证和授权。用户在访问应用程序之前首先要通过身份提供者进行登录认证。

  2. 应用程序注册:每个应用程序都需要注册到身份提供者中,以便进行认证和授权。注册过程包括提供应用程序的元数据(如应用程序标识符、回调URL等)。

  3. 用户登录:用户在访问某个应用程序时,首先被重定向到身份提供者的登录页面。用户输入凭据(如用户名和密码)进行登录认证。

  4. 身份提供者认证:身份提供者验证用户的凭据,并生成一个安全令牌(如基于标准的JSON Web Token,JWT)。

  5. 安全令牌传递:身份提供者将安全令牌传递回应用程序,并重定向用户回到应用程序的回调URL。

  6. 应用程序验证:应用程序接收到安全令牌后,通过与身份提供者进行通信来验证令牌的有效性和真实性。

  7. 用户授权:一旦应用程序验证了安全令牌,它可以基于令牌中的用户身份信息对用户进行授权,并提供相应的资源和功能。

  8. 会话管理:一旦用户通过单点登录成功访问了一个应用程序,后续的访问将会话信息保存在该应用程序中,使用户可以无需重复登录访问其他受信任的应用程序。

通过上述步骤,用户只需要进行一次登录认证,就可以在多个应用程序中使用单一的凭据进行访问,从而提供了更好的用户体验和方便性。在实际的实现中,可以使用标准的身份验证协议和技术,如 OAuth、OpenID Connect 等来支持单点登录的实现。

涉及到跨域名如何传递 Token

当涉及到跨域名的安全令牌传递时,可以采用以下方法来处理:

  1. 跨域资源共享(Cross-Origin Resource Sharing,CORS):使用 CORS 机制可以在跨域请求中传递安全令牌。在服务器端配置CORS策略,允许特定域名的请求访问资源。这样,身份提供者可以在跨域请求的响应头中包含 Access-Control-Allow-Origin 字段,指定允许访问的域名。

  2. 代理服务器(Proxy Server):使用代理服务器作为中间层来转发请求可以绕过跨域限制。前端应用程序可以将请求发送到同一域名下的代理服务器,然后由代理服务器进行跨域请求并将安全令牌传递给身份提供者。身份提供者返回的响应再通过代理服务器返回给前端应用程序。

  3. JSONP(JSON with Padding):JSONP是一种利用 <script> 标签进行跨域请求的方法。前端应用程序可以创建一个 <script> 标签,将安全令牌作为查询参数传递给身份提供者的接口 URL。身份提供者接收到请求后,将响应包装在一个 JavaScript 函数中返回。这样前端应用程序可以通过定义该函数来获取安全令牌。

  4. 令牌交换协议:使用令牌交换协议,如 OAuth 2.0 的授权码授权流程或隐式授权流程,可以在授权过程中进行跨域请求。前端应用程序通过重定向到身份提供者的授权页面,获取授权码或访问令牌,然后将授权码或令牌传递回自己的后端服务器。后端服务器再通过服务器端与身份提供者进行通信来获取安全令牌,并将其返回给前端应用程序。

在处理跨域安全令牌传递时,需要考虑安全性和防止令牌泄漏的风险。确保在传递令牌时采用合适的安全措施,如使用 HTTPS 协议来保护数据传输,避免在URL中明文传递敏感信息等。此外,还应遵循安全最佳实践和标准,以保护用户身份和数据的安全。

什么是 OAuth 2.0?

180px-Oauth_logo.svg.png

OAuth 2.0是一个业界标准的 授权协议

第三方认证技术方案最主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。所以 OAuth 协议为用户资源的授权提供了一个安全的、开放而又简单的标准。同时,任何第三方都可以使用 OAuth 认证服务,所以有针对各种语言的开发包(PHP、JavaScript、Java、Ruby 等)

实际上它就是一种授权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 token,使得第三方应用能够通过该令牌获取相关的资源。

OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。......资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。即 OAuth 的核心就是向第三方应用颁发令牌

而 OAuth 2.0 是对 OAuth 1.0 的完全重新设计,OAuth 2.0更快,更容易实现,OAuth 1.0 已经被废弃。

OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的 OAuth 2.0 协议。

在 OAuth 2.0 的协议交互中,有四个角色的定义

  • 资源所有者(Resource Owner):顾名思义,拥有资源的所有权的人。
  • 资源服务器(Resource Server):保存着受保护的用户资源。
  • 应用程序(Client):准备访问用户资源的应用程序。
  • 授权服务器(Authorization Server):授权服务器,在获取用户的同意授权后,颁发访问令牌给应用程序,以便其获取用户资源。

由于互联网有多种场景,所以这个标准定义了获得令牌的四种授权方式(authorization grant)。也就是说,OAuth 2.0 规定了四种获得令牌的流程。你可以选择最适合自己的那一种,向第三方应用颁发令牌。下面就是这四种授权方式。

  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码式(password)
  • 客户端凭证(client credentials)

注意,不管哪一种授权方式,第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。

具体的使用方式,看网络安全那里的 OAuth 2.0 的授权码授权流程或隐式授权流程