什么是正确的授权码 OAuth2 流程?
Posted
技术标签:
【中文标题】什么是正确的授权码 OAuth2 流程?【英文标题】:What is the proper Authorization Code OAuth2 flow? 【发布时间】:2020-11-23 17:39:12 【问题描述】:我目前对 OAuth2.0 授权代码流程不熟悉,我已经阅读了很多关于它的文章,目前我仍然不知道如何正确实施它。到目前为止,我对流程的了解:
-
用户使用 OAuth 登录
用户被重定向到授权服务器获取授权码
权限/范围回调
重定向到授权服务器以获取访问令牌以换取授权码
使用访问令牌重定向回客户端
客户端使用访问令牌访问资源服务器。
现在,我仍然困惑的是登录验证应该从哪里来(用户名的登录 - 密码)?是否在进入 OAuth 流程之前进行单独的验证,一旦用户有效,就应该返回流程?
【问题讨论】:
【参考方案1】:我有一些资源可以解释OAuth 2.0 using Google Sign in as an example。让我试着根据你的问题改写一下。
我们以用户使用“使用 Google 登录”登录对讲机为例。
-
用户按下“使用 Google 登录”按钮。这将重定向到身份提供者
/authorize
端点(每个提供者可能不同),这些端点会转到他们的登录页面。
用户被重定向到 Google 的帐户页面。如果尚未登录,用户可以在此处输入他们的 Google 电子邮件/密码。
Google 使用 authorization_code
重定向回对讲机(例如,它重定向到 https://intercom.com/authcallback?code=XYZ...
)
Intercom 的后端服务器发送 authorization_code
和 client_id
和 client_secret
(来自他们在 google 的项目),并接收 access_token
(通常发送到 /token
端点)
Intercom 然后可以使用access_token
从 Google 访问用户的个人资料。
为了回答您的问题,用户可以在 OAuth 提供商的页面中输入他们的电子邮件/密码。请记住,OAuth 2.0 并未指定提供商如何对用户进行身份验证。这意味着,OAuth 提供者可以通过不同的方式验证他们的用户,例如电子邮件/密码、email magic-link, SMS OTP 等。您的网站应该相信 OAuth 提供者他们正在为您正确地验证用户。
一些额外的资源可以帮助您更多地了解 OAuth 2.0:
How to store the OAuth 2.0 access and refresh token in your front end Picking the right OAuth 2.0 flow【讨论】:
感谢您的回复,这意味着登录验证与流程是分开的,对吧?从提供者成功登录后,将调用授权端点? 是的,登录验证与流程分开。您将调用 /authorize 端点以转到 Google 的登录页面。所以在登录成功之前会调用授权端点。 1. 调用/authorize 进入谷歌登录页面 2. 用户在谷歌登录页面登录成功 3. 谷歌重定向回你的应用到example.com/authcallback?code=123...等等【参考方案2】:登录验证来了(登录用户名 - 密码)?
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 是在 OAuth 或 OpenID Connect 上使用 PKCE。
【讨论】:
感谢您的回复。您能否解释一下用户何时被重定向到单独的登录页面?那是什么流程?它也是 OAuth 的一部分吗?这就是我现在困惑的部分【参考方案3】:通常的解决方案是使用成熟的安全库将 OAuth 2.0 和 Open Id Connect 从您的代码中外部化。当您不熟悉这种类型的安全性时,会有一个学习曲线。我的资源会让您了解它们是如何组合在一起的:
Code Sample Tutorial Blog Post您集成的库取决于您使用的技术堆栈。以上资源适用于单页应用和 NodeJS API。
【讨论】:
以上是关于什么是正确的授权码 OAuth2 流程?的主要内容,如果未能解决你的问题,请参考以下文章