OAuth教程--OpenID Connect
本文是oauth.com上的教程的翻译。(原文地址)
OAuth 2.0框架明确不提供有关已授权应用程序的用户的任何信息。OAuth 2.0是一个委派框架,允许第三方应用程序代表用户行事,而无需应用程序知道用户的身份。
OpenID Connect采用OAuth 2.0框架并在顶部添加标识层。它提供有关用户的信息,并使客户端能够建立登录会话。虽然本章并不是OpenID Connect的完整指南,但它旨在阐明OAuth 2.0和OpenID Connect如何相互关联。
授权与身份验证
OAuth 2.0被称为授权“框架”而不是“协议”,因为核心规范实际上为各种实现留下了相当大的空间,根据其用例不同地执行操作。具体来说,OAuth 2.0不提供说明用户是谁或如何进行身份验证的机制,它只是说用户委托应用程序代表他们行事。OAuth 2.0框架以访问令牌的形式提供此委派,应用程序可以使用该令牌代表用户执行操作。访问令牌被呈现给API(“资源服务器”),其知道如何验证访问令牌是否是活动的。从应用程序的角度来看,它是一个不透明的字符串。
当您入住酒店时,您将获得一张钥匙卡,您可以使用该卡进入指定的房间。您可以将钥匙卡视为访问令牌。钥匙卡上没有说明您的身份,也没有说明您在前台的身份验证,但您可以在入住期间使用该卡进入酒店房间。同样,OAuth 2.0访问令牌不会指示用户是谁,它只是您可以用来访问数据的东西,它可能会在将来某个时候到期。
OAuth 2.0有意设计为在不提供用户身份和身份验证的情况下提供授权,因为这些问题具有非常不同的安全注意事项,这些注意事项不一定与授权协议的安全注意事项重叠。分别处理身份验证和身份允许是OAuth 2.0框架用作构建身份验证协议的一部分。
构建身份验证框架
OAuth 2.0框架是作为构建身份验证和身份协议的基础。
要使用OAuth 2.0作为身份验证协议的基础,您至少需要做一些事情。
- 定义endpoint以返回有关用户的属性
- 定义第三方应用程序可用于进行请求用户身份信息的一个或多个范围
- 在处理身份验证时,需要定义其错误代码和必要的扩展参数,例如当会话超时重新提示用户输入凭据,或者如何允许用户选择新帐户登录应用程序。
通常,当单个提供商尝试向OAuth 2.0添加内容以创建身份验证和身份协议时,这会导致另一个API具有不同程度的安全性。OpenID Connect从许多不同的实现中获取共享,并将其标准化为适合企业级实现的协议。
ID令牌
OpenID Connect的核心基于一个名为“ID令牌”的概念。这是授权服务器将返回的新令牌类型,它对用户的身份验证信息进行编码。与仅旨在由资源服务器理解的访问令牌相反,ID令牌旨在被第三方应用程序理解。当客户端发出OpenID Connect请求时,它可以请求ID令牌以及访问令牌。
OpenID Connect的ID令牌采用JWT(JSON Web令牌)的形式,JWT是一个JSON有效负载,使用发行者的私钥进行签名,并且可以由应用程序进行解析和验证。
JWT内部是一些定义的属性名称,它们为应用程序提供信息。它们用简写名称表示,以保持JWT的整体大小。这包括用户的唯一标识符(sub即“subject”的缩写),发出令牌的服务器的标识符(iss即“issuer”的缩写),请求此令牌的客户端的标识符(aud即“audience”的缩写),以及少数属性,例如令牌的生命周期,以及用户在多长时间之前获得主要身份验证提示。
{
"iss": "https://server.example.com",
"sub": "24400320",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"acr": "urn:mace:incommon:iap:silver"
}
标准化endpoint,名称和元数据有助于减少实现错误,并允许传递共享关于安全性考虑的知识。
总结
OpenID Connect在OAuth 2.0框架之上提供用户身份和身份验证。您可以使用OpenID Connect建立登录会话,并使用OAuth访问受保护资源。
您可以是有与OAuth 2.0相同的流程,以便同时请求ID令牌和访问令牌两种认证,以及获得授权访问受保护的资源。
OpenID Connect由OpenID Foundation维护。可以在https://openid.net/connect/
上完整阅读核心OpenID Connect规范以及许多扩展。
OpenID Connect Debugger是一个奇妙的资源,帮助您构建OpenID Connect请求。此外,OAuth 2.0 Playground还提供了针对实时服务器的OpenID Connect流程演练。
在使用Google登录时,我们将使用OpenID Connect构建一个示例应用。