为我的API实现OAuth 2.0身份验证

31

我已经成功使用了Facebook Graph API(使用oauth 2.0进行身份验证)一段时间。现在我需要编写自己的API,使开发人员可以以类似的方式连接到它。我研究了各种库,但我想要更简洁的东西,所以我决定自己动手。看着我在Facebook上认证用户的代码似乎相对简单,但如果我偏离了轨道,请纠正我。

首先,我需要提供一个安全页面,消费者需要重定向到该页面。例如 https://api.mydomain.com/oauth/authorize?client_id=CONSUMER_KEY&redirect_url=CALLBACK_URL。用户会验证应用程序,然后我会将oauth_token作为查询字符串重定向回回调URL中提供的URL。我想我可以在这里生成一个随机唯一字符串作为oauth_token,并将其存储在此特定消费者的用户中(编辑:请参见下面的答案,这应该是每个consumer应用程序而不是用户的唯一标识符)。

第一步完成了。现在我需要提供第二个安全页面,其中消费者将触发Web请求。例如 https://api.mydomain.com/oauth/access_token?client_id=CONSUMER_KEY&client_secret=CONSUMER_SECRET&oauth_token=OAUTH_TOKEN_RETURNED_ABOVE。这将允许消费者交换上述返回的oauth_token以获得访问令牌。我会再次生成一个随机唯一字符串,并将其存储在此特定消费者的用户中。

现在,我的API将接受access_token,用于尝试获取特定于使用它的用户的信息的方法。

我希望知道自己是否正确理解了这些事情。如果是这样,OAuth 2.0 规范似乎非常琐碎。那么为什么我们必须用 access_token 来交换 oauth_token?我有自己的想法,但如果有人能帮助澄清就会非常感激。

如果我完全错误地实现了这个功能,我不希望浪费数小时的时间,所以我真的很期待您的反馈。

谢谢

1个回答

49

实际上,协议流程图对于可视化 OAuth 2 等规范非常有帮助,但目前只有一些部分的作品。由于我刚刚实现了一个仅限客户端的 OAuth 2 库,我可以验证您正在正确的方向上。但是这里有一个问题:

oauth_token 属于您的客户端应用程序(即桌面 Facebook 阅读器),它会对您的应用程序进行身份验证(就像 ID 一样)。您提交此令牌以获取访问令牌,该令牌特定于您的应用程序和已登录的用户,允许您访问与用户相关的受限资源。

这是一个基本的桌面应用程序身份验证过程(摘自:http://developers.gigya.com/020_Developer_Guide/85_REST/OAuth2

REST OAuth 2.0

实际上,具有时间线的流程图(从上到下,摘自:http://www.ibm.com/developerworks/web/library/wa-oauthsupport/?ca=drs-

Protocol flow

最后,完整的过程是:(摘自:http://h2anetwork.org/ProjectDocs/DPI/DPI_Framework.html

OAuth protocol flow


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接