
有哪些新闻媒体提供Open API?
OAuth 2.0 和 OpenID Connect (OIDC) 是用于用户身份验证和授权的行业标准协议。Okta 身份解决方案基于这些标准。
OAuth 2.0 和 OpenID Connect (OIDC) 是互补协议。它们定义服务器如何对用户进行身份验证,然后授予用户对资源的访问权限。
Okta 建议使用其身份验证部署模型之一来满足应用程序的身份验证需求。每个模型都抽象了 OAuth 2.0 和 OIDC 协议,因此您不必直接使用它们。
提示: 如果您需要自定义应用程序设置和工作流程,并可以直接访问您的 Okta 组织和应用程序集成,请使用Authentication API。此 API 支持 Okta 重定向模型、嵌入式登录小部件和身份验证 JS 开发工具包。
OAuth 2.0 是一种标准,应用程序通过该标准向客户端应用程序提供访问权限。如果您希望以一种安全的方式授予对您应用数据的访问权限,那么您应该使用 OAuth 2.0 协议。
OAuth 2.0 规范有四个重要角色:
其他重要术语:
下面介绍了常用的 OAuth 2.0 授权代码流程。
OAuth 2.0 和 OIDC(OpenID Connect)的核心都是授权服务器。授权服务器本质上就是一个 OAuth 2.0 令牌生成引擎。每个授权服务器都有一个唯一的发行者 URI(Uniform Resource Identifier,统一资源标识符)和自己的令牌签名密钥,以确保安全域之间有明显的界限。在本指南的上下文中,Okta 就是您的授权服务器。
授权服务器还充当 OIDC 提供程序。这意味着您可以请求ID 令牌 (打开新窗口)除了访问令牌 (打开新窗口)从授权服务器端点。
OpenID Connect (OIDC) 是一个在 OAuth 2.0 基础上构建的身份验证标准。它定义了一种 ID 令牌类型,与 OAuth 2.0 的访问令牌和刷新令牌配合使用。此外,OIDC 还对 OAuth 2.0 中留待选择的一些领域进行了标准化,如作用域(scopes)、端点发现(endpoint discovery)以及客户端的动态注册(dynamic registration)。Okta 已获得 OpenID 认证。
尽管 OIDC 扩展了 OAuth 2.0,但OIDC 规范 (打开新窗口)对流中的角色使用略有不同的术语:
OpenID Connect 和常规 OAuth 2.0 流的高级流看起来相同。主要区别在于,OpenID Connect 流除了会生成任何访问令牌或刷新令牌外,还会生成 ID 令牌。
您使用的 OAuth 流程取决于您的使用案例。以下部分根据以下因素推荐 OAuth 2.0 流程:
下表显示了要用于您正在构建的应用程序类型的 OAuth 2.0 流程。
应用程序类型 | OAuth 2.0 流程/授权类型 | 访问令牌? | ID 令牌? |
---|---|---|---|
服务器端(又名 Web)、 单页应用程序 或本机 | 带有 PKCE 或 交互代码的授权代码(仅限身份引擎)。 | ✅ | ✅ |
信任 | 交互代码 | ✅ | ✅ |
服务 | 客户端凭证 | ✅ | ❌ |
注意:还有一个 OAuth 2.0 SAML 2.0 断言流。此流程适用于希望使用现有信任关系而无需在授权服务器上执行直接用户批准步骤的客户端应用程序。它支持 access 令牌和 ID 令牌。
OAuth 2.0 流的类型取决于您要构建的客户端类型。此流程图可以快速帮助您决定使用哪个流程。
单页应用(SPA)、移动应用和原生应用都属于公开应用,终端用户可以查看甚至可能修改应用的源代码。代码中的任何敏感信息都可能暴露给恶意用户。相比之下,服务器端(Web)应用和桌面应用属于机密或私有应用。机密客户端可以使用客户端认证方法,如客户端密钥和私钥。
您的客户使用的是重定向模型还是嵌入式模型?
重定向模型
如果您的 SPA 或本机应用程序将身份验证请求重定向到 Okta 托管的登录页面,请使用带有 PKCE 的授权码流程。
嵌入式模型
如果您的应用程序本身托管身份验证流,请使用 Interaction Code 流。
一个在没有直接终端用户参与的服务器上运行的客户端应用可以被信任为能够负责任地使用其自身的凭据。如果您的客户端应用仅进行机器到机器的交互,那么您应该使用客户端凭据流(Client Credentials Flow)。
如果您既拥有某个应用,又拥有该应用所访问的资源,那么这个应用就是高可信度的。因为您对这两者都拥有所有权,所以您可以信任该应用能够妥善处理终端用户的用户名和密码。在这种情况下,并且仅当其他认证流程不可行时,您可以使用资源所有者密码凭据流程(Resource Owner Password Credentials Flow,简称资源密码流)。但是,该流程不支持多因素身份验证,因此请考虑使用其他替代方案,如授权码流程
如果您的应用程序不是高信任度,或者您想要利用多重身份验证,则应使用授权代码流程。
代码交换的证明密钥 (PKCE) 最初设计为保护移动应用程序中的授权代码流的扩展。但是,它能够防止授权代码注入并保持流程安全,因此非常适合各种类型的 OAuth 客户端。Okta 建议您尽可能将授权代码流程与 PKCE 一起用于 OAuth 客户端。
该流程要求您的应用生成一个加密随机字符串,称为代码验证程序。然后,对代码验证程序进行哈希处理以创建代码质询,并且此质询与授权代码请求一起传递。授权服务器使用授权码进行响应,并将代码质询与授权码相关联。
应用程序收到授权码后,它会在访问令牌请求中发送授权码和代码验证器。授权服务器使用先前商定的哈希算法重新计算验证程序的质询。然后,授权服务器将挑战码与之前与授权码关联的挑战码进行比较。如果两个挑战码和验证器相匹配,授权服务器就知道这两个请求是由同一个客户端发送的。
交互代码流程扩展了 OAuth 2.0 和 OIDC 标准。它要求客户端将客户端 ID 和 PKCE 参数传递给 Okta,以确保流的安全。用户可以用最少的信息启动请求,依靠客户端来促进与 Okta 的交互以验证用户身份。
注意:交互代码流仅在 Identity Engine 组织中可用。
资源所有者密码流适用于以下使用案例:
它最常见于为在线服务制作的第一方客户端中,比如与Facebook服务交互的Facebook客户端应用。它不需要像授权码流程或隐式流程那样进行重定向,而是只涉及对端点的一次经过身份验证的调用。/token
客户端凭据流适用于没有最终用户的服务器端(机密)客户端应用程序。通常,这意味着机器对机器的通信。该应用需要是服务器端应用,因为它必须能够安全地保管客户端密钥。由于凭证是硬编码的,因此实际的终端用户无法使用它。该流程涉及向端点发送一个经过身份验证的请求,该请求将返回一个访问令牌。/token
注意:客户端凭证流不支持刷新令牌。
此流程适用于无需在授权服务器上直接获取用户批准,而是利用现有信任关系的客户端应用。它允许客户端应用从SAML身份提供者(Identity Provider)处获得一个有效且已签名的SAML断言,并以此断言来从OAuth授权服务器处获取一个OAuth访问令牌。例如,当您希望从仅支持委托权限而无需提示用户输入凭据的API中检索数据时,此流程就非常有用。
要使用 SAML 2.0 断言作为授权授予,客户端需要向身份提供商发出 SAML 请求。然后,身份提供商在响应中发送回 SAML 2.0 断言。然后,客户端请求具有授权类型的访问令牌并包含该参数。该参数的值是 Base64 编码的 SAML 2.0 断言。在该请求中,您只能发送一个 SAML 断言。urn:ietf:params:oauth:grant-type:saml2-bearerassertionassertion
注意:隐式流是仅用于不支持 PKCE 的 SPA 的旧流。
隐式流程(Implicit Flow)旨在为不支持跨源资源共享(CORS)的基于浏览器的应用而设计。此外,它还适用于缺乏现代加密API且无法保护客户端密钥的基于浏览器的应用。在此流程中,客户端不会向端点发送请求,而是在从端点重定向的过程中接收访问令牌。客户端必须能够与资源所有者的用户代理交互,并接收来自授权服务器的传入请求(通过重定向)。/token/authorize
注意:由于 Implicit 流始终适用于不太受信任的客户端,因此它不支持刷新令牌。
重要:对于在支持 Web Crypto for PKCE 的现代浏览器中运行的单页应用程序 (SPA),Okta 建议将授权代码流程与 PKCE 一起使用。使用此流而不是 Implicit 流以获得最大的安全性。如果需要支持较旧的浏览器,隐式流将提供功能性解决方案。