了解OAuth2的流程

时间:2019-08-15 20:37:09

标签: oauth-2.0 discord

我是OAuth2的新手,我试图了解整个过程。对于上下文,我正在考虑制作一个Web仪表板,以便用户通过Discord的OAuth2 API登录。

根据目前为止的理解,我认为流程是这样工作的:

  1. 用户转到我的网站并单击登录链接
  2. 我的网站使用我的客户端ID 和查询字符串中的重定向URL#1 将它们重定向到Discord
  3. Discord使用查询字符串中的授权代码将它们重定向到重定向URL#1 到我的网站
  4. 我的网站使用此授权代码,并带有我的客户端ID 客户端机密重定向URL#2 ,使用所有这些从Discord提取访问令牌刷新令牌
  5. 如果我确实获得了访问令牌,则意味着用户现在已“登录”(授权码有效)
  6. 我的网站最终将用户重定向到页面,现在可以使用访问令牌将请求自由发送到Discord的API,同时保存访问令牌< / em>和刷新令牌。例如,假设页面声明其Discord用户名

我正在向this guide学习,而令我困惑的是指南中的this code snippet。在第5行,它在查询字符串中提供了上述的重定向URL#2 。我不确定它是干什么的。

此外,我不太清楚一旦获得访问令牌后如何继续。如果有多个用户登录,则手边会有多个访问令牌。假设用户想再次访问页面,我如何唯一地标识他们并知道使用哪个访问令牌将请求发送到Discord的API? (对于此示例,请求将向我提供其用户名,该用户名将显示在页面上)

是的,我可能有很多错误的概念。任何澄清将不胜感激!

编辑:我对此进行了更多研究,并找到了much better guide here

对于我有关第二个重定向URL的问题,在进行访问令牌和刷新令牌交换时,official documentation中的示例指定了redirect_uri。但是,此新指南无需进行访问令牌交换。也许他们错过了吗?正如other stack overflow question所说:

  

作为一种额外的安全措施,服务器应验证此请求中的重定向URL完全匹配此授权代码的初始授权请求中包含的重定向URL。如果重定向URL不匹配,则服务器将拒绝请求,并显示错误。

我认为这意味着在第一次访问令牌交换之后,任何刷新令牌交换或带有访问令牌的直达API请求都需要与所述第一次访问令牌交换的原始redirect_uri相匹配。因此,我应该只使用一个redirect_uri,刷新令牌交换/ API请求实际上并不使用redirect_uri,而是用于进一步的安全性。

对于整个登录过程,似乎我必须将获得的访问和刷新令牌链接到用户会话,为此,我将研究使用这种护照策略passport-discord。然后,会话期满后,我将丢弃这两个令牌,并且它们将不得不再次单击登录,但是我可以使用以下prompt选项:

  

提示控制授权流程如何处理现有授权。如果用户先前已使用所请求的范围对您的应用程序进行了授权,并且提示设置为同意,它将要求他们重新批准其授权。如果设置为none,它将跳过授权屏幕,并将其重定向回您的重定向URI,而无需请求其授权。

我想从那里存储与该用户关联的新访问权限和刷新令牌。

如果能指出我的思维过程中有任何错误,我将不胜感激!

2 个答案:

答案 0 :(得分:1)

您的总结对我来说似乎很好,Cloud先生-值得澄清您是在开发带有服务器端的SPA还是(旧的)Web应用程序。最常见的是第一个是无cookie的,而第二个是在cookie中存储刷新令牌的。关键是要了解OAuth消息工作流的外观。对于SPA和API,我的这篇文章可能有助于您阐明所需的内容:https://authguidance.com/2017/09/26/basicspa-oauthworkflow/ 很高兴回答任何后续问题..

答案 1 :(得分:0)

您可以使用隐式授权与 SPA 一起使用 https://discord.com/developers/docs/topics/oauth2#implicit-grant