我们有一个网站, 只有这样,才能登录并使用该网站与Facebook验证自己的身份(这不是我的选择)。 你与Facebook首次登录,账号就会自动为您创建。
现在,我们要为我们的网站的iPhone应用程序,也为其他公共API使用我们的服务。
这个问题是关于如何使用我们的网站从应用程序/ API认证,并分为两个部分:
什么是从API到一个网站上,只使用Facebook的OAuth的作为身份验证方法处理REST认证的正确方法是什么?
我已阅读并研究了很多有关REST API认证的标准方法。 我们不能用这样的方法为基本身份验证通过HTTPS ,因为有一个用户本身没有凭据。 喜欢的东西, 这似乎是仅适用于使用API验证的应用程序。
目前,我能想到的最好的办法就是你打一个/授权终点在我们的API,它重定向到Facebook的OAuth的,然后重定向回网站,并提供了一个“令牌”该API的用户可以使用后续的验证要求。
为此,我们建立一个正式的申请,我们不一定需要使用公共API以同样的方式。 什么是最好的方式,然后谈谈我们的网站和用户进行身份验证?
我的理解(我认为)如何进行身份验证正在使用我们的API,使用API(公共)密钥和密钥(私有)密钥的第三方应用程序。 然而,当涉及到验证谁在使用应用程序的用户,我得到相当困惑如何去了解它时,唯一的办法,我们必须验证用户就是Facebook。
我觉得我失去了一些东西很明显的,或不完全了解的REST API应该如何公开工作,所以任何的建议和帮助,将不胜感激。
UPDATE:见下文
我一直在努力思考这个问题了。 这并不完全清楚,我还没有,但这里是我考虑去的路线。 我创建一个REST API的我用户只与Facebook连接权威性。
客户端:
- 使用Facebook API登录并获得OAuth2用户代码。
- 交换这个代码的访问令牌。
- 在每次调用我的自定义API,我会包括Facebook的用户ID和访问令牌。
在API(每一个需要用户身份验证方法):
- 请使用访问令牌从上面的/我的Facebook图形的请求。
- 验证的Facebook用户ID返回传递给我的API从上面的用户ID相匹配。
- 如果访问令牌已过期,需要额外的通信。
我还没有进行测试。 它是怎样的声音?
---更新:2014年7月27日回答的问题---
在登录时我只使用上述交流一次。 一旦我确定哪个用户登录,创建我自己的访问令牌,以及令牌从该点向前使用。 因此,新的流程是这样的......
客户端:
- 使用Facebook API登录并获得OAuth2用户代码。
- 交换这个代码的访问令牌。
- 从我的 API请求访问令牌,包括Facebook的令牌作为参数
在API
- 接受访问令牌请求。
- 请使用Facebook访问令牌/我的Facebook图形的请求
- 验证Facebook的用户存在,并匹配到用户在我的数据库
- 创建自己的访问令牌,将其保存并返回给客户端从现在开始使用
这是我的实现使用JWTs(JSON网络令牌),基本上与克里斯的更新的答案。 我已经使用Facebook的JS SDK和智威汤逊。
下面是我的实现。
客户:使用Facebook SDK JS登录并获得访问令牌。
客户:通过调用我的API请求JWT /verify-access-token
端点。
MyAPI:接收访问令牌,通过调用验证它/me
端点Facebook的API的。
MyAPI:如果访问令牌是有效的,认为用户从数据库中,如果存在用户登录。 有需要的领域的有效载荷,设置到期创建一个智威汤逊标志的密钥,并发送回客户端。
客户端:存储JWT在本地存储。
客户端:发送与用于下一个API调用请求一起令牌(该JWT从步骤5)。
MyAPI:验证用密钥的令牌,如果令牌是有效的,交换信物了一个新的,将其发送回客户端与API响应一起。 (无外部API调用用于此处后令牌的验证)若令牌无效/过期请求客户端再次进行身份验证,并从1重复]
客户端替换为新的一个存储的令牌,并使用它的下一个API调用。 一旦令牌到期满足时,令牌过期撤销访问API。
每个令牌使用一次。
阅读关于安全和智威汤逊更多的答案
如何安全是智威汤逊
如果你能解码JWT他们如何安全吗?
JSON网络令牌(JWT)的使用者识别和认证令牌
我想回答同样的问题,最近已经经历了很多的阅读...
我不会有“”的答案,但事情变得对我来说有点清晰。 你读过的评论,你提到的文章 ? 我发现他们真的很有趣,乐于助人。
其结果是,在事情的演变方式,因为第一篇文章已被写入光,这就是我想我会做的事:
请注意,我仍然大量研究在所有这些东西,这样可能不是一个完美的答案...也许甚至不是一个正确的! 但我认为这将使一个很好的起点。 使用“扩展授予”为Facebook的身份验证可能涉及不必注册它做正确的事情的想法? 我不太清楚。
无论如何,我希望我能够帮助你,甚至有点,并且至少可以开始进行讨论,找到解决这一问题的最佳解决方案:)
更新
Facebook登录是不是一个解决方案,指出在意见:任何人都可以发送任意的用户ID和登录为对API该用户。
什么做这件事是这样的:
- 显示登录表单带有“Facebook登录”按钮
- 如果选择这种登录方式,行为有点像Facebook的SDK:从您的验证服务器打开一个网页,这将引发Facebook登录。
- 一旦用户登录,Facebook将使用重定向URL确认; 作出这样的URL指向您的身份验证服务器的另一个端点(可能具有指示调用一个额外的参数从一个应用程序来的?)
- 当验证的端点被击中,认证可以安全地识别用户,保留其FB用户ID / FB会话,并使用自定义URL方案返回一个访问令牌您的应用程序,就像Facebook的SDK会做
看起来更好?