对网站的REST API,它使用Facebook的身份验证(REST API for website

2019-06-17 19:33发布

我们有一个网站, 只有这样,才能登录并使用该网站与Facebook验证自己的身份(这不是我的选择)。 你与Facebook首次登录,账号就会自动为您创建。

现在,我们要为我们的网站的iPhone应用程序,也为其他公共API使用我们的服务。

这个问题是关于如何使用我们的网站从应用程序/ API认证,并分为两个部分:

  1. 什么是从API到一个网站上,只使用Facebook的OAuth的作为身份验证方法处理REST认证的正确方法是什么?

    我已阅读并研究了很多有关REST API认证的标准方法。 我们不能用这样的方法为基本身份验证通过HTTPS ,因为有一个用户本身没有凭据。 喜欢的东西, 这似乎是仅适用于使用API验证的应用程序。

    目前,我能想到的最好的办法就是你打一个/授权终点在我们的API,它重定向到Facebook的OAuth的,然后重定向回网站,并提供了一个“令牌”该API的用户可以使用后续的验证要求。

  2. 为此,我们建立一个正式的申请,我们不一定需要使用公共API以同样的方式。 什么是最好的方式,然后谈谈我们的网站和用户进行身份验证?

我的理解(我认为)如何进行身份验证正在使用我们的API,使用API​​(公共)密钥和密钥(私有)密钥的第三方应用程序。 然而,当涉及到验证谁在使用应用程序的用户,我得到相当困惑如何去了解它时,唯一的办法,我们必须验证用户就是Facebook。

我觉得我失去了一些东西很明显的,或不完全了解的REST API应该如何公开工作,所以任何的建议和帮助,将不胜感激。

Answer 1:

UPDATE:见下文

我一直在努力思考这个问题了。 这并不完全清楚,我还没有,但这里是我考虑去的路线。 我创建一个REST API的我用户与Facebook连接权威性。

客户端:

  1. 使用Facebook API登录并获得OAuth2用户代码。
  2. 交换这个代码的访问令牌。
  3. 在每次调用我的自定义API,我会包括Facebook的用户ID和访问令牌。

在API(每一个需要用户身份验证方法):

  1. 请使用访问令牌从上面的/我的Facebook图形的请求。
  2. 验证的Facebook用户ID返回传递给我的API从上面的用户ID相匹配。
  3. 如果访问令牌已过期,需要额外的通信。

我还没有进行测试。 它是怎样的声音?

---更新:2014年7月27日回答的问题---

在登录时我只使用上述交流一次。 一旦我确定哪个用户登录,创建我自己的访问令牌,以及令牌从该点向前使用。 因此,新的流程是这样的......

客户端:

  1. 使用Facebook API登录并获得OAuth2用户代码。
  2. 交换这个代码的访问令牌。
  3. 我的 API请求访问令牌,包括Facebook的令牌作为参数

在API

  1. 接受访问令牌请求。
  2. 请使用Facebook访问令牌/我的Facebook图形的请求
  3. 验证Facebook的用户存在,并匹配到用户在我的数据库
  4. 创建自己的访问令牌,将其保存并返回给客户端从现在开始使用


Answer 2:

这是我的实现使用JWTs(JSON网络令牌),基本上与克里斯的更新的答案。 我已经使用Facebook的JS SDK和智威汤逊。

下面是我的实现。

  1. 客户:使用Facebook SDK JS登录并获得访问令牌。

  2. 客户:通过调用我的API请求JWT /verify-access-token端点。

  3. MyAPI:接收访问令牌,通过调用验证它/me端点Facebook的API的。

  4. MyAPI:如果访问令牌是有效的,认为用户从数据库中,如果存在用户登录。 有需要的领域的有效载荷,设置到期创建一个智威汤逊标志的密钥,并发送回客户端。

  5. 客户端:存储JWT在本地存储。

  6. 客户端:发送与用于下一个API调用请求一起令牌(该JWT从步骤5)。

  7. MyAPI:验证用密钥的令牌,如果令牌是有效的,交换信物了一个新的,将其发送回客户端与API响应一起。 (无外部API调用用于此处后令牌的验证)若令牌无效/过期请求客户端再次进行身份验证,并从1重复]

  8. 客户端替换为新的一个存储的令牌,并使用它的下一个API调用。 一旦令牌到期满足时,令牌过期撤销访问API。

每个令牌使用一次。

阅读关于安全和智威汤逊更多的答案

如何安全是智威汤逊

如果你能解码JWT他们如何安全吗?

JSON网络令牌(JWT)的使用者识别和认证令牌



Answer 3:

我想回答同样的问题,最近已经经历了很多的阅读...

我不会有“”的答案,但事情变得对我来说有点清晰。 你读过的评论,你提到的文章 ? 我发现他们真的很有趣,乐于助人。

其结果是,在事情的演变方式,因为第一篇文章已被写入光,这就是我想我会做的事:

  • HTTPS无处不在 - 这可以让你对HMAC,签约,现时,忘记...

  • 使用的OAuth2:

    • 当认证请求来自我自己的应用程序/网站,使用所描述的这种“伎俩”(或它的变化) 的文章回复之前提到的。

    • 就我而言,我有两种类型的用户:那些经典的登录/密码凭证和那些谁以Facebook Connect注册。
      所以我提供了一个常规的登录表单与“登录与Facebook”按钮。 如果用户用他的“经典”的凭据登录的,我只是用它们发送给我的OAuth2端点grant_type=password
      如果他选择通过Facebook登录,我认为这将是一个两步的过程:

      • 首先,使用Facebook的iOS SDK来打开一个FBSession
      • 如果这样做了,程序就还给控制,应该有一种方式来获得该用户的Facebook的ID。 我想单独发送该ID到我的OAuth2端点的延长补助由我的服务器理解为“使用FB用户ID”。

请注意,我仍然大量研究在所有这些东西,这样可能不是一个完美的答案...也许甚至不是一个正确的! 但我认为这将使一个很好的起点。 使用“扩展授予”为Facebook的身份验证可能涉及不必注册它做正确的事情的想法? 我不太清楚。

无论如何,我希望我能够帮助你,甚至有点,并且至少可以开始进行讨论,找到解决这一问题的最佳解决方案:)

更新
Facebook登录是不是一个解决方案,指出在意见:任何人都可以发送任意的用户ID和登录为对API该用户。

什么做这件事是这样的:

  • 显示登录表单带有“Facebook登录”按钮
  • 如果选择这种登录方式,行为有点像Facebook的SDK:从您的验证服务器打开一个网页,这将引发Facebook登录。
  • 一旦用户登录,Facebook将使用重定向URL确认; 作出这样的URL指向您的身份验证服务器的另一个端点(可能具有指示调用一个额外的参数从一个应用程序来的?)
  • 当验证的端点被击中,认证可以安全地识别用户,保留其FB用户ID / FB会话,并使用自定义URL方案返回一个访问令牌您的应用程序,就像Facebook的SDK会做

看起来更好?



文章来源: REST API for website which uses Facebook for authentication