(GitHub)非OA网站应用程序的API OAuth身份验证?

Ken*_*itt 8 authentication oauth github-api oauth-2.0

我困惑的开始

我特意与GitHub合作,但这似乎很普遍.

GitHub文档状态[格式化已由我修改]:

有三种方法可以通过GitHub API v3进行身份验证....

  • 基本认证
  • OAuth2令牌(在标头中发送)
  • OAuth2令牌(作为参数发送)
  • OAuth2密钥/秘密

...请注意,对于非网站的应用程序,可以通过编程方式获取 OAuth2令牌.

[我假设第二个和第三个项目实际上被认为是单一的"身份验证方式"但是,根据该部分中的格式,"失败的登录限制"也可能被误解为"验证方式"为没有明确的"三种方式"清单.]

以上"以编程方式获取"链接的文本开始:

如果您需要少量令牌,实施Web流程可能很麻烦.相反,可以使用OAuth Authorizations API使用基本身份验证创建令牌.要为特定OAuth应用程序创建令牌,您必须提供其在OAuth应用程序设置页面上找到的客户端ID和密码,该页面是从GitHub上的OAuth应用程序列表链接的.如果您的OAuth应用程序打算为一个用户创建多个令牌,则应使用指纹来区分它们.

通过另一种身份验证形式的授权验证?

解析我的困惑

让我们一句一句地解析上述所有内容.

第一句

如果您需要少量令牌,实施Web流程可能很麻烦.

好吧,希望我真棒的非网站应用程序会有很多用户,所以我需要很多令牌,对吧?那么这是不是意味着,我应该"实施网络流程"?我怀疑它确实如此.

第二句

相反,可以使用OAuth Authorizations API使用基本身份验证创建令牌.

现在,这非常令人困惑.我希望我的非网站应用程序(NAWP)代表我的用户与GitHub进行交互,我希望他们能够避免未经身份验证的用户API请求速率限制.我不能只用GitHub注册我的应用程序,并在我的请求中包含我的注册客户端ID和秘密,因为:

此方法仅应用于服务器到服务器调用.您永远不应与任何人共享您的客户机密,或将其包含在客户端浏览器代码中.

因此,我想使用我的NAWP向GitHub或代表用户进行身份验证.

因此,我可以使用特殊授权API创建身份验证令牌,以访问常规GitHub API,但我必须首先使用基本身份验证进行身份验证.大.一个问题 - 我通过基本身份验证提供哪些凭据才能访问授权API?矿?一个特殊的GitHub帐户只适用于我的应用程序?用户的?

我猜我应该使用用户的凭据,并且用户必须信任我的NAWP,一旦使用它们为自己创建身份验证令牌,就会立即忘记这些凭据.好吧,这似乎不太理想,但我现在愿意继续.

第三句

要为特定OAuth应用程序创建令牌,您必须提供其在OAuth应用程序设置页面上找到的客户端ID和密码,该页面是从GitHub上的OAuth应用程序列表链接的.

等待.WTF.我使用我的用户的GitHub用户名和密码(或用户必须自己生成的令牌?)进行身份验证,他们可以让我的NAWP永远使用,特别是如果我只是想访问公共信息但是避免速率限制?) ,然后我的NAWP必须通过发出请求来请求生成OAuth令牌,其中一个必需参数是......"要为其创建令牌的40个字符OAuth app客户端密钥."

这似乎不对.

在文档的第一部分中,引用了这个问题的顶部,在"OAuth2密钥/秘密"子部分下,它写成:

这应该仅用于服务器到服务器方案.不要将OAuth应用程序的客户端密钥泄露给您的用户.

此外,在"增加OAuth应用程序的未经身份验证的速率限制"子部分中,写入:

如果您的OAuth应用程序需要以更高的速率限制进行未经身份验证的调用,则可以将应用程序的客户端ID和机密作为查询字符串的一部分传递.

...

此方法仅应用于服务器到服务器调用.您永远不应与任何人共享您的客户机密,或将其包含在客户端浏览器代码中.

我错过了什么吗?我肯定错过了什么.因为当然我无法安全地分发GitHub在我的NAWP中为我生成的客户端秘密.

第四句

如果您的OAuth应用程序打算为一个用户创建多个令牌,则应使用指纹来区分它们.

这根本不是混乱(我不是讽刺).如果我的NAWP的单个实例被多个用户使用,那么我只需要包含某种标识符来区分我需要或想要创建的任何标记; 非常简单.

但理解这句话并没有消除我对前三个的困惑.

重申我的困惑

那么,是否或者不可能代表GitHub用户使用OAuth对NAWP 进行安全身份验证?

我猜它不是,并且安全使用OAuth的唯一方法是在其作者保护的环境中运行的代码(所以是webapp).

如果我猜错了,请详细解释(详细)NAWP如何代表其用户通过OAuth进行身份验证.

如果您的解决方案涉及使用NAWP文件分发客户机密,就像下面博客文章中概述的解决方案一样,请理解这不是问题,特别是考虑到GitHub在其文档中反复坚持,客户机密不应该与任何人共享.

Edw*_*ang 5

是的,您部分正确。使用非 Web 应用程序使用 OAuth 代表用户进行安全验证是不可能的。这是因为 GitHub 只实现了authorization_codeOAuth 流程。

相反,您需要有一个 Web 服务器来帮助您安全地对用户进行身份验证。

一般过程如下所示:

  1. 您的应用会将用户(或打开一个弹出窗口)重定向到您的网页
  2. 您的网络服务器会将您的用户重定向到 GitHub 站点,从而启动 OAuth 流程。
  3. GitHub 将使用授权码将您的用户重定向回您的服务器。
  4. 您的服务器将处理授权代码交换,并检索有效的 GitHub 访问令牌。
  5. 您的服务器可以通过链接到自定义 url 方案(类似于 app12345://authorize?access_token=XYZ,对移动应用程序有用)或带有片段的 url(类似于https://example.com/oauth/github#access_token=XYZ ),您的桌面应用程序将从 URL 字符串中读取。

如果您想查看类似流程的快速示例,我为LinkedIn、Node.js 和 iOS 应用程序做了类似的事情。

  • 是的,不过值得庆幸的是,这个代码应该非常简单,并且实现起来并不太困难。如果您确实不想这样做,您可以要求用户通过此页面手动创建令牌:https://github.com/settings/tokens 并将其放入您的应用程序中。 (2认同)