OAuth 2.0 & OpenID Connect

OAuth 2.0 和 OpenID Connect 是目前广泛使用的授权(Authorization)和身份验证(Authentication)标准。OAuth 2.0 提供了一种安全的授权方式,而 OpenID Connect 在 OAuth 2.0 的基础上增加了身份验证的功能。

OAuth 2.0 授权模式

OAuth 2.0 定义了四种授权模式,分别适用于不同的应用场景:

  1. 授权码模式(Authorization Code Grant)
  • 流程
    1. 客户端将用户重定向到授权服务器。
    2. 用户同意授权。
    3. 授权服务器将用户重定向回客户端,附带一个授权码。
    4. 客户端使用授权码向授权服务器请求访问令牌。
    5. 授权服务器验证授权码和客户端信息,如果验证通过,则发放访问令牌。
  • 举例:用户登录第三方应用(如社交网站应用),应用请求访问用户在社交网站上的信息。
  1. 简化模式(Implicit Grant)
  • 流程
    1. 客户端将用户重定向到授权服务器。
    2. 用户同意授权。
    3. 授权服务器将用户重定向回客户端,URL 中直接附带访问令牌。
  • 举例:适用于纯前端应用,如单页应用(SPA)。
  1. 密码模式(Resource Owner Password Credentials Grant)
  • 流程
    1. 用户向客户端提供用户名和密码。
    2. 客户端使用用户名和密码向授权服务器请求访问令牌。
    3. 授权服务器验证凭据,如果验证通过,则发放访问令牌。
  • 举例:用户直接在第三方应用输入登录凭据,适用于用户和客户端高度可信的场景。
  1. 客户端凭据模式(Client Credentials Grant)
  • 流程
    1. 客户端向授权服务器提供其自己的凭据。
    2. 授权服务器验证客户端凭据,如果验证通过,则发放访问令牌。
  • 举例:适用于客户端访问自己保护的资源,如内部系统间的API调用。
  1. 扩展: 设备码模式(Device Authorization Grant)
  • 流程
    1. 设备请求码:设备向授权服务器发起请求,授权服务器返回一个用户码(user code)、一个设备码(device code),以及验证用户码的URL。
    2. 用户授权:设备展示给用户一个用户码和验证URL,指导用户使用另外的设备(如智能手机或电脑)访问给定的URL并输入用户码进行授权。
    3. 设备轮询:设备使用设备码定期轮询授权服务器,询问用户是否完成了授权操作。
    4. 获取访问令牌:一旦用户完成授权,授权服务器响应设备的轮询请求,发放访问令牌给设备。
  • 举例:那些没有浏览器或有限输入能力的设备上,如智能电视、游戏机、打印机等,以便这些设备能够安全地获得用户授权。假设你有一台智能电视,想要观看某个需要授权的视频流服务。电视屏幕上显示一个代码和一个URL,告诉你使用手机或电脑访问这个URL并输入代码。你按照指示操作,登录视频流服务的账号,并授权你的电视访问服务。在这个过程中,你的电视定期向服务的授权服务器发送请求,查询授权状态。一旦你完成了授权操作,电视即获得访问令牌,可以加载并播放视频内容。这就是设备码模式的一个典型应用场景。

OpenID Connect

OpenID Connect 在 OAuth 2.0 的基础上增加了身份层。它允许客户端通过验证用户的身份信息(ID Token),来进行身份验证。

  • ID Token:是一个 JWT(JSON Web Token),包含了用户的身份信息。

OpenID Connect 主要使用的是 OAuth 2.0 的授权码模式,增加了一些参数和步骤来支持身份验证:

  1. 客户端将用户重定向到授权服务器,请求授权码,并指明需要“openid”作用域(scope)。
  2. 用户登录并同意授权。
  3. 授权服务器将用户重定向回客户端,附带授权码。
  4. 客户端使用授权码向授权服务器请求访问令牌,并同时会返回一个 ID Token。
  5. 客户端可以解析 ID Token 来获取用户的身份信息。

通过这种方式,OpenID Connect 不仅提供了 OAuth 2.0 的授权机制,还增加了身份验证的能力,使得它成为了构建现代应用中身份验证和授权的重要标准。