我发现这个问题很老了。但万一其他人会
到这里,我有一些答案,应该对 2019 年 3 月有用。
让我从总体概述开始。
SSO
SSO https://en.wikipedia.org/wiki/Single_sign-on可以通过个人 Google、Facebook、GitHub、Twitter、Microsoft 帐户来完成。登录您的帐户后,您可以无需密码登录其他系统(例如 WordPress 或任何其他系统)(如果其他系统与该身份提供商集成),并且您同意(见下图)。
有些服务的主要重点是提供身份提供商/SSO 功能(例如 Okta、Auth0、Google Cloud Identity、Azure Active Directory、AWS IAM)。
在企业网络中,用户可以基于 AD 帐户进行静默登录,而无需通过 ADFS 输入凭据。
实际上,ADFS 支持不同的身份验证协议,例如 SAML、WS-Fed 和 OAuth。但现在通常服务实现OpenID 连接 https://openid.net/connect/faq/它在之上工作OAuth 2.0 https://oauth.net/2/协议。
OpenID 连接流程
OpenID Connect 定义了许多身份验证流程。
最优选的是:
-
Authorization Code Flow with PKCE
(单页应用程序、本机应用程序)
如果您正在使用oidc-client-js
,你应该使用response_type=code
使用 PKCE。
公共本机应用程序客户端必须实现代码交换的证明密钥 (PKCE RFC7636])
https://www.rfc-editor.org/rfc/rfc8252#section-6 https://www.rfc-editor.org/rfc/rfc8252#section-6
注意:尽管迄今为止建议将 PKCE 作为保护本机应用程序的机制,但此建议适用于所有类型的 OAuth 客户端,包括 Web 应用程序。
https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-12#section-3.1.1 https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-12#section-3.1.1
-
Implicit flow
当作是不建议:
客户端不应该使用隐式授权和任何其他导致授权服务器在授权响应中发出访问令牌的响应类型
https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-09 https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-09
-
Client credentials flow
。用于服务到服务的通信。
如何配置ADFS?
您可以在以下位置找到非常详细的文档,其中包含“本机应用程序场景”的插图Microsoft Docs:使用 ADFS 的本机客户端 https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/development/native-client-with-ad-fs.
如果您不使用 ADFS,您可以使用 PKCE 流设置操场 https://www.oauth.com/playground/authorization-code-with-pkce.html.
JavaScript 前端
Never将客户端机密存储在 JS 前端或移动应用程序等公共应用程序中。它不适用于 PKCE 流程,但以防万一。
如果你有一个现代的 SPA 应用程序(例如 Angular 或 React),这意味着前端应该只有client_id
使最终用户能够获取 JWTaccess_token
通过 ADFS 在浏览器中。你不需要任何client_secret
.
oidc-客户端-js https://github.com/IdentityModel/oidc-client-js/可以帮助你。确保code_verifier
与令牌请求一起发送(这意味着您正在使用更安全的 PKCE 流程)。
PHP后端
在 PHP 方面,您需要验证访问令牌。您可以根据以下内容自行实现工作流程那篇文章 https://auth0.com/docs/api-auth/tutorials/authorization-code-grant-pkce。但最好使用 OpenID 认证库,您可以在此页面上找到它(不仅适用于 PHP):https://openid.net/developers/certified/ https://openid.net/developers/certified/
所以,对于 PHP 来说只有一种:phpOIDC https://bitbucket.org/PEOFIAMP/phpoidc.
验证
OAuth 2.0 只能帮助您进行身份验证(识别用户的身份)。
您很可能希望为不同的用户拥有不同的权限。 ADFS 中的 OpenID Connect 实施使您能够将 AD 组映射到令牌声明。因此,您可以在后端解码 JWT 访问令牌并实现基于声明的授权。
要使用 JWT 声明,请务必正确验证令牌和发行者的真实性:
- 使用公钥验证 JWT 签名
- Check
issuer
对于适当的发行者(身份提供商)
- Check
aud
(观众)获取正确的客户端 ID
- Check
exp
(过期时间戳)
- 检查索赔