正确的授权码 OAuth2 流程是什么?
What is the proper Authorization Code OAuth2 flow?
我目前不熟悉 OAuth2.0 授权代码流程,我已经阅读了很多关于它的文章,但目前我仍然不知道如何正确实施它。到目前为止,我对流程的了解:
- 用户使用 OAuth 登录
- 用户被重定向到授权服务器以获取授权码
- 回调 permission/scope
- 重定向到授权服务器以获取访问令牌以换取授权码
- 使用访问令牌重定向回客户端
- 客户端使用访问令牌访问资源服务器。
现在,我仍然很困惑的是登录验证应该从哪里来(用户名登录-密码)?是否在进入 OAuth 流程之前进行单独验证,一旦用户有效,它应该返回流程?
登录验证来了(登录用户名-密码)?
OAuth 2.0 NOT an Authentication protocol
The OAuth 2.0 specification defines a delegation protocol
用户名-密码的任何使用都在 OAuth 2.0 之外,您应该查看 Open ID Connect,它是建立在 OAuth 2.0 之上的身份验证协议。
Best current Practice for Authorization Code flow is to use PKCE 在 OAuth 或 OpenID Connect 上。
通常的解决方案是使用成熟的安全库从代码中外部化 OAuth 2.0 和 Open Id Connect。当您不熟悉这种类型的安全时,会有一个学习曲线。我的资源会让您了解它们是如何组合在一起的:
您集成的库取决于您使用的技术堆栈。以上资源适用于单页应用程序和 NodeJS API。
我有一些资源可以解释 OAuth 2.0 using Google Sign in as an example。让我试着根据你的问题改写一下。
让我们使用用户 logging-in 使用“使用 Google 登录”进行对讲的示例。
- 用户按下按钮“使用 Google 登录”。这将重定向到身份提供者
/authorize
端点(每个提供者可能不同),该端点将转到他们的登录页面。
- 用户被重定向到 Google 的帐户页面。如果还没有 logged-in,用户可以在此处 输入他们的 Google email/password。
- Google 使用
authorization_code
重定向回 Intercom(例如,它重定向到 https://intercom.com/authcallback?code=XYZ...
)
- Intercom 的后端服务器发送此
authorization_code
以及 client_id
和 client_secret
(来自他们在 google 中的项目),并接收 access_token
(通常到 /token
端点)
- Intercom 然后可以使用
access_token
从 Google 访问用户的个人资料。
因此,为了回答您的问题,用户可以在 OAuth 提供商的页面 中输入他们的email/password。请记住,OAuth 2.0 没有指定提供商如何验证用户。这意味着,OAuth 提供者可以通过不同的方式验证他们的用户,例如 email/password、email magic-link, SMS OTP 等。您的网站应该信任 OAuth 提供者,他们会正确地为您验证用户。
一些额外的资源可以帮助您更多地了解 OAuth 2.0:
我目前不熟悉 OAuth2.0 授权代码流程,我已经阅读了很多关于它的文章,但目前我仍然不知道如何正确实施它。到目前为止,我对流程的了解:
- 用户使用 OAuth 登录
- 用户被重定向到授权服务器以获取授权码
- 回调 permission/scope
- 重定向到授权服务器以获取访问令牌以换取授权码
- 使用访问令牌重定向回客户端
- 客户端使用访问令牌访问资源服务器。
现在,我仍然很困惑的是登录验证应该从哪里来(用户名登录-密码)?是否在进入 OAuth 流程之前进行单独验证,一旦用户有效,它应该返回流程?
登录验证来了(登录用户名-密码)?
OAuth 2.0 NOT an Authentication protocol
The OAuth 2.0 specification defines a delegation protocol
用户名-密码的任何使用都在 OAuth 2.0 之外,您应该查看 Open ID Connect,它是建立在 OAuth 2.0 之上的身份验证协议。
Best current Practice for Authorization Code flow is to use PKCE 在 OAuth 或 OpenID Connect 上。
通常的解决方案是使用成熟的安全库从代码中外部化 OAuth 2.0 和 Open Id Connect。当您不熟悉这种类型的安全时,会有一个学习曲线。我的资源会让您了解它们是如何组合在一起的:
您集成的库取决于您使用的技术堆栈。以上资源适用于单页应用程序和 NodeJS API。
我有一些资源可以解释 OAuth 2.0 using Google Sign in as an example。让我试着根据你的问题改写一下。
让我们使用用户 logging-in 使用“使用 Google 登录”进行对讲的示例。
- 用户按下按钮“使用 Google 登录”。这将重定向到身份提供者
/authorize
端点(每个提供者可能不同),该端点将转到他们的登录页面。 - 用户被重定向到 Google 的帐户页面。如果还没有 logged-in,用户可以在此处 输入他们的 Google email/password。
- Google 使用
authorization_code
重定向回 Intercom(例如,它重定向到https://intercom.com/authcallback?code=XYZ...
) - Intercom 的后端服务器发送此
authorization_code
以及client_id
和client_secret
(来自他们在 google 中的项目),并接收access_token
(通常到/token
端点) - Intercom 然后可以使用
access_token
从 Google 访问用户的个人资料。
因此,为了回答您的问题,用户可以在 OAuth 提供商的页面 中输入他们的email/password。请记住,OAuth 2.0 没有指定提供商如何验证用户。这意味着,OAuth 提供者可以通过不同的方式验证他们的用户,例如 email/password、email magic-link, SMS OTP 等。您的网站应该信任 OAuth 提供者,他们会正确地为您验证用户。
一些额外的资源可以帮助您更多地了解 OAuth 2.0: