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

时间:2016-05-02 19:16:03

标签: authentication oauth oauth-2.0 github-api

我困惑的开始

我特意与GitHub合作,但这似乎非常普遍。

The GitHub docs状态[格式化已由我修改]:

  

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

     
      
  • 基本身份验证
  •   
  • OAuth2令牌(在标头中发送)
  •   
  • OAuth2令牌(作为参数发送)
  •   
  • OAuth2 Key / Secret
  •   
     

...请注意,对于非网站的应用,OAuth2令牌可以是acquired programmatically

[我假设第二项和第三项确实被认为是一种单一的认证方式'但是,根据该部分的格式,"登录限制失败"也有可能被误解为一种认证方式'因为没有明确列出"三种方式"。]

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

  

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

通过授权通过其他形式的身份验证进行身份验证?

解析我的困惑

让我们逐句解析上述所有内容。

第一句

  

如果您需要少量令牌,实施网络流程可能很麻烦。

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

第二句

  

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

现在,这非常令人困惑。我希望我的非网站应用程序(NAWP)代表我的用户与GitHub进行交互,我希望他们避免the unauthenticated user API request rate limitingAnd I can't just register my application with GitHub and include my registered client ID and secret in my requests因为:

  

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

所以我想使用我的NAWP向GitHub或代表用户进行身份验证。

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

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

第三句

  

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

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

这看起来不对。

在文档的第一部分中,引用了这个问题的顶部,在" OAuth2 Key / Secret"小节,写成:

  

这应仅用于服务器到服务器方案。请勿将OAuth应用程序的客户机密泄露给您的用户。

另外,在the "Increasing the unauthenticated rate limit for OAuth applications" sub-section中写道:

  

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

     

...

     

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

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

第四句

  

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

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

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

重述我的困惑

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

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

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

如果您的解决方案涉及使用NAWP文件分发客户端密钥,以及下面博客文章中概述的解决方案,那么请解释这不是一个问题,特别是考虑到GitHub在其文档中反复坚持,客户的秘密不应该与任何人分享。

1 个答案:

答案 0 :(得分:3)

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

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

一般过程如下:

  1. 您的应用会将用户(或打开弹出窗口)重定向到您的网页
  2. 您的网络服务器会将您的用户重定向到GitHub网站,启动OAuth流程。
  3. GitHub会使用授权码将您的用户重定向回您的服务器。
  4. 您的服务器将处理授权代码交换,并检索有效的GitHub访问令牌。
  5. 您的服务器可以通过链接到自定义网址方案(例如app12345:// authorize?access_token = XYZ,对移动应用非常有用)或带有片段的网址,将访问令牌发送回非Web应用程序(类似https://example.com/oauth/github#access_token=XYZ),您的桌面应用将从URL字符串中读取。
  6. 如果您想查看类似流程的快速示例,我为LinkedIn, Node.js, and an iOS app做了类似的事情。