使用Facebook进行身份验证的网站的REST API
我们有一个网站,在网站上登录和认证自己的唯一方法是使用Facebook(这不是我的选择)。 您第一次使用Facebook登录时,会自动为您创建一个帐户。
我们现在要为我们的网站创建一个iPhone应用程序,并且还要为其他人使用我们的服务提供一个公共API。
这个问题是关于如何通过app / API从我们的网站进行身份验证,并且分为两部分:
从API到只使用Facebook OAuth作为身份验证方法的网站处理REST身份验证的正确方法是什么?
我已阅读并研究了很多关于REST API的标准认证方法。 我们不能使用基于HTTPS的基本身份验证之类的方法,因为没有这样的用户凭据。 像这样的东西似乎只用于使用API对应用程序进行身份验证。
目前,我能想到的最佳方式是,您在我们的API上点击/授权端点,重定向到Facebook OAuth,然后重定向回站点并提供API的用户可以用来后续进行身份验证的“令牌”要求。
对于我们创建的官方应用程序,我们不一定需要以相同的方式使用公共API。 与我们的网站谈话并验证用户的最佳方式是什么?
我了解(我认为)如何使用API(公共)密钥和秘密(私人)密钥来认证使用我们的API的第三方应用程序。 但是,当涉及到认证使用该应用程序的用户时,我对如何解决这个问题感到困惑,因为我们必须对Facebook用户进行身份验证。
我觉得我错过了一些非常明显的东西,或者不完全了解公共REST API应该如何工作,所以任何建议和帮助将不胜感激。
更新:见下文
我一直在想这个问题。 目前还不完全清楚,但这是我正在考虑的路线。 我正在创建一个REST API,我的用户只使用Facebook连接进行身份验证。
在客户端上:
在API上(对于需要用户认证的每种方法):
我还没有测试这个。 它听起来如何?
---更新:2014年7月27日回答问题---
我只在登录时使用上述交换。 一旦我确定哪个用户正在登录,我创建了自己的访问令牌,并且从那个点开始使用该令牌。 所以新的流程看起来像这样...
在客户端上:
在API上
这是我使用JWT(JSON Web Tokens)的实现,基本上类似于Chris的更新答案。 我已经使用Facebook JS SDK和JWT。
这是我的实现。
客户端:使用Facebook JS SDK登录并获取访问令牌。
客户端:通过调用/verify-access-token
端点从我的API请求JWT。
MyAPI:接收访问令牌,通过调用Facebook API的/me
端点来验证它。
MyAPI:如果访问令牌有效,则从数据库中查找用户,如果存在则登录该用户。 创建一个有必要字段的JWT作为有效载荷,设置到期日期,用密钥签名并发送回客户端。
客户:将JWT存储在本地存储中。
客户端:将令牌连同对下一个API调用的请求一起发送。
MyAPI:使用密钥验证令牌,如果令牌有效,则将令牌换成新密钥,并将其与API响应一起发送回客户端。 (在此之后没有外部API调用来验证令牌)[如果令牌无效/过期的请求客户端再次验证并从1开始重复]
客户端将存储的令牌替换为新的令牌,并将其用于下一个API调用。 一旦令牌到期满足,令牌就会过期撤销对API的访问。
每个令牌都使用一次。
阅读关于安全和智威汤逊的更多答案
智威汤逊有多安全
如果你能解码智威汤逊,他们如何安全?
JSON Web令牌(JWT)作为用户标识和身份验证令牌
我正试图回答同样的问题,并且最近经历了很多阅读......
我不会有“答案”,但对我来说事情变得更加清晰。 你有没有读过你提到的文章中的评论? 我发现他们非常有趣和有帮助。
因此,鉴于自第一篇文章撰写以来的事态发展,我认为我会这样做:
无处不在的HTTPS - 这可让您忘记HMAC,签名,随机数,...
使用OAuth2:
当身份验证请求来自我自己的应用程序/网站时,请使用前面提到的文章回复中描述的这个“窍门”(或其变体)。
就我而言,我有两种类型的用户:那些拥有经典登录/密码凭证的用户以及已经使用Facebook Connect注册的用户。
所以我会提供一个带有“使用Facebook登录”按钮的常规登录表单。 如果用户使用他的“经典”凭证登录,则只需使用grant_type=password
将这些凭证发送到我的OAuth2终端。
如果他选择通过Facebook登录,我认为这将是一个两步骤的过程:
请注意,我仍在大量研究所有这些内容,所以这可能不是一个完美的答案......也许甚至不是一个正确的答案! 但我认为这将是一个很好的起点。 为Facebook身份验证使用“扩展授权”的想法可能涉及必须注册才能正确执行操作? 我不太确定。
无论如何,我希望我能够帮助你一点,至少它可以开始讨论,找到解决这个问题的最佳解决方案:)
更新
Facebook注册不是解决方案中的注释:任何人都可以发送任意用户ID并以该用户身份登录API。
如何做到这一点:
看起来更好?
链接地址: http://www.djcxy.com/p/61157.html上一篇: REST API for website which uses Facebook for authentication
下一篇: Images Rotating