我希望允许用户使用github登录我正在创建的将由API驱动的网站。但是,我遇到了一个问题,似乎没有办法验证用户并获取他们的电子邮件和名称,而无需将它们重定向到当前页面上的github。我试图创建一个弹出窗口,但是我无法从弹出窗口中获取必要的数据,即用于下一次调用的api令牌。
答案 0 :(得分:2)
问题的答案是“使用不同的资助流程”,但您的问题告诉我您不了解OAuth资助流程,因此您可以通过OAuth讲座获得更好的服务。
弹出窗口和iframe专门设计用于防止在其外部运行的代码捕获数据,因为如果你可以这样做,那么在狡猾的广告中隐藏的iframe就可以了。放弃这种方法,因为在不太可能发生的情况下,浏览器制造商会立即采取措施阻止您的解决方案正常工作。
您描述的行为听起来像是隐式授权流程。
这是a walkthrough of the various ways OAuth2 can work。
隐式授权是一种使用重定向来故意控制远离代码的流程 - 可能会受到攻击或冒充 - 并将其提供给受信任的第三方,OAuth提供商:在这种情况下为GitHub。您预先注册了身份验证后返回控件的点,其中的点始终是您的代码。
有些流程使用弹出窗口。通常这是授权代码授权流程。弹出窗口不适合移动设备,这导致创建隐式授权流程。
不喜欢重定向的通常原因是它引起的健忘症。解决方案是在将控制权交给OAuth提供程序之前持久存储应用程序状态,并编写一个从oauth返回处理程序,该处理程序从重定向参数解包JWT,然后恢复您保存的应用程序状态。
如果用户在身份验证之前是匿名的,请将您的状态序列化为字符串并将其放在cookie或localStorage中。
如果用户不匿名且正在对提升权限进行身份验证,则必须将任何特权数据发送到服务器,并在浏览器上保留检索令牌。您必须确保检索此状态需要有效的OAuth令牌和有效的状态令牌,并且在遵守请求后丢弃状态,以便重放攻击将是显着的(您将必须处理余量)。 / p>
获得有效令牌后,您可以使用它从GitHub请求配置文件信息。 JWT中可能已经存在非常小的数量;您可能拥有用作登录信息的电子邮件地址,但这不一定是通信的正确信息。
看起来GitHub只支持代码授权身份验证。这意味着你必须做popup / iframe的事情。这是他们的doco:
https://developer.github.com/v3/oauth/
此流程不会为您提供编码令牌,它会为您提供可以兑换编码令牌的代码。我们的想法是,当令牌过期时,您可以使用代码获取刷新令牌而无需通过线路发送凭据。
答案 1 :(得分:1)
不仅您有重定向,而且从2020年12月开始,您还可以:
OAuth 2.0 Device Authorization Flow now GA
除了现有的Web应用程序流程外,GitHub Apps和OAuth Apps现在还支持OAuth 2.0 Device Authorization Grant 的GA支持。
这允许任何CLI客户端或开发人员工具使用authenticate using a secondary system with a browser。
GitHub CLI在login命令上使用此身份验证方法。有关更多信息,请阅读Authorizing OAuth Apps和Authorizing Users for GitHub Apps上的完整文档。