正确的授权码 OAuth2 流程是什么?

What is the proper Authorization Code OAuth2 flow?

我目前不熟悉 OAuth2.0 授权代码流程,我已经阅读了很多关于它的文章,但目前我仍然不知道如何正确实施它。到目前为止,我对流程的了解:

  1. 用户使用 OAuth 登录
  2. 用户被重定向到授权服务器以获取授权码
  3. 回调 permission/scope
  4. 重定向到授权服务器以获取访问令牌以换取授权码
  5. 使用访问令牌重定向回客户端
  6. 客户端使用访问令牌访问资源服务器。

现在,我仍然很困惑的是登录验证应该从哪里来(用户名登录-密码)?是否在进入 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 登录”进行对讲的示例。

  1. 用户按下按钮“使用 Google 登录”。这将重定向到身份提供者 /authorize 端点(每个提供者可能不同),该端点将转到他们的登录页面。
  2. 用户被重定向到 Google 的帐户页面。如果还没有 logged-in,用户可以在此处 输入他们的 Google email/password
  3. Google 使用 authorization_code 重定向回 Intercom(例如,它重定向到 https://intercom.com/authcallback?code=XYZ...
  4. Intercom 的后端服务器发送此 authorization_code 以及 client_idclient_secret(来自他们在 google 中的项目),并接收 access_token(通常到 /token 端点)
  5. Intercom 然后可以使用 access_token 从 Google 访问用户的个人资料。

因此,为了回答您的问题,用户可以在 OAuth 提供商的页面 中输入他们的email/password。请记住,OAuth 2.0 没有指定提供商如何验证用户。这意味着,OAuth 提供者可以通过不同的方式验证他们的用户,例如 email/password、email magic-link, SMS OTP 等。您的网站应该信任 OAuth 提供者,他们会正确地为您验证用户。


一些额外的资源可以帮助您更多地了解 OAuth 2.0: