我们有一个网站,只有 方式登录并通过Facebook验证自己(这不是我的选择)。第一次使用Facebook登录时,会自动为您创建一个帐户。
我们现在想为我们的网站创建一个iPhone应用程序,并为其他人创建一个公共API来使用我们的服务。
此问题是关于如何通过app / API对我们的网站进行身份验证,并分为两部分:
从API到只使用Facebook OAuth作为身份验证方法的网站处理REST身份验证的正确方法是什么?
我已经阅读并研究了很多关于REST API的标准身份验证方法。我们不能使用Basic Auth over HTTPS这样的方法,因为没有用户凭证。像this这样的东西似乎只是用于使用API验证应用程序。
目前,我认为最好的方法是在API上点击/授权终点,重定向到Facebook OAuth,然后重定向回网站并提供API用户可以使用的“令牌”验证后续请求。
对于我们创建的官方应用程序,我们不一定需要以相同的方式使用公共API。那么与我们的网站交流并对用户进行身份验证的最佳方式是什么?
我理解(我认为)如何使用API(公共)密钥和秘密(私有)密钥对使用我们的API的第三方应用程序进行身份验证。但是,在对使用该应用程序的用户进行身份验证时,当我们对用户进行身份验证的唯一方法是Facebook时,我对如何解决这个问题感到很困惑。
我觉得我错过了一些非常明显的东西,或者没有完全理解公共REST API应该如何工作,所以任何建议和帮助都会非常感激。
答案 0 :(得分:90)
我也一直在考虑这个问题。我还不完全清楚,但这是我想要走的路线。我正在创建一个REST API,我的用户仅使用Facebook连接验证。
在客户端:
在API上(对于需要用户身份验证的每种方法):
我还没有测试过这个。听起来怎么样?
登录时我只使用上述交换一次。一旦我确定登录了哪个用户,我就创建了自己的访问令牌,并且从那一点开始使用该令牌。所以新流程看起来像这样......
在客户端:
关于API
答案 1 :(得分:14)
这是我使用JWT(JSON Web令牌)的实现,基本上类似于Chris的更新答案。我使用过Facebook JS SDK和JWT。
这是我的实施。
客户端:使用Facebook JS SDK登录并获取访问令牌。
客户端:通过调用/verify-access-token
端点从我的API请求JWT。
MyAPI:接收访问令牌,通过调用Facebook API的/me
端点进行验证。
MyAPI:如果访问令牌有效,则从数据库中找到该用户,如果存在,则登录该用户。创建一个JWT,其中包含必填字段作为有效负载,设置到期日期,使用密钥签名并发送回客户端。
客户端:将JWT存储在本地存储中。
客户端:发送令牌(步骤5中的JWT)以及下一次API调用的请求。
MyAPI:使用密钥验证令牌,如果令牌有效,则将令牌更换为新密钥,并将其与API响应一起发送回客户端。 (之后没有外部API调用以验证令牌)[如果令牌无效/过期请求客户端再次进行身份验证并从1开始重复]
客户端用新的令牌替换存储的令牌,并将其用于下一次API调用。一旦满足令牌到期,令牌就会过期撤销对API的访问。
每个令牌都使用一次。
阅读有关安全性和JWT的更多答案
If you can decode JWT how are they secure?
JSON Web Tokens (JWT) as user identification and authentication tokens
答案 2 :(得分:5)
我想回答同样的问题,并且最近经历了很多阅读......
我不会有“答案”,但事情对我来说有点清楚。您是否阅读了the article you mentioned中的评论?我发现它们非常有趣且有用。
结果,并且根据自第一篇文章撰写以来事物的演变情况,以下是我认为我会做的事情:
无处不在的HTTPS - 这让你忘记了HMAC,签名,现时,......
使用OAuth2:
当身份验证请求来自我自己的应用/网站时,请使用前面提到的reply to the article中描述的“技巧”(或其变体)。
就我而言,我有两种类型的用户:具有经典登录/密码凭据的用户以及使用Facebook Connect注册的用户。
因此,我将提供一个“登录Facebook”按钮的常规登录表单。如果用户使用“经典”凭据登录,我只需使用grant_type=password
将其发送到OAuth2端点。
如果他选择通过Facebook登录,我认为这将分为两个步骤:
请注意,我仍然在研究所有这些东西,所以这可能不是一个完美的答案......也许甚至不是一个正确的答案!但我认为这将是一个很好的起点。 使用“扩展授权”进行Facebook身份验证的想法可能需要注册才能正确执行操作?我不太确定。
无论如何,我希望我能够帮助你一点,至少它可以开始讨论找到这个问题的最佳解决方案:)
<强>更新强>
Facebook登录不是评论中指出的解决方案:任何人都可以发送任意用户ID并以此用户身份登录API。
这样做是怎么回事:
看起来更好?