使用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连接进行身份验证。

    在客户端上:

  • 使用Facebook API登录并获取OAUTH2代码。
  • 将此代码交换为访问令牌。
  • 在每次调用我的自定义API时,我都会包含Facebook用户标识和访问令牌。
  • 在API上(对于需要用户认证的每种方法):

  • 使用上面的访问令牌向/我的Facebook图表发出请求。
  • 确认返回的Facebook用户标识与从上方传递给我的API的用户标识匹配。
  • 如果访问令牌已过期,则需要额外的通信。
  • 我还没有测试这个。 它听起来如何?

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

    我只在登录时使用上述交换。 一旦我确定哪个用户正在登录,我创建了自己的访问令牌,并且从那个点开始使用该令牌。 所以新的流程看起来像这样...

    在客户端上:

  • 使用Facebook API登录并获取OAUTH2代码。
  • 将此代码交换为访问令牌。
  • 从我的API请求访问令牌,包括Facebook令牌作为参数
  • 在API上

  • 接收访问令牌请求。
  • 使用Facebook访问令牌向/我的Facebook图表发出请求
  • 验证Facebook用户是否存在并与我的数据库中的用户匹配
  • 创建我自己的访问令牌,将其保存并将其返回给客户端,以便从此处使用

  • 这是我使用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 iOS SDK打开一个FBSession
  • 当完成并且应用程序被重新控制时,应该有办法为该用户获取Facebook ID。 我会将此ID单独发送到我的OAuth2端点,并将我的服务器所理解的扩展授权理解为“使用FB用户ID”。
  • 请注意,我仍在大量研究所有这些内容,所以这可能不是一个完美的答案......也许甚至不是一个正确的答案! 但我认为这将是一个很好的起点。 为Facebook身份验证使用“扩展授权”的想法可能涉及必须注册才能正确执行操作? 我不太确定。

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

    更新
    Facebook注册不是解决方案中的注释:任何人都可以发送任意用户ID并以该用户身份登录API。

    如何做到这一点:

  • 用“Facebook登录”按钮显示登录表单
  • 如果选择此登录方法,请像Facebook SDK那样操作:从认证服务器打开一个网页,该网页将启动Facebook登录。
  • 用户登录后,Facebook将使用您的重定向网址进行确认; 使该URL指向您的身份验证服务器的另一个端点(可能带有一个额外的参数,指示该调用来自应用程序?)
  • 当身份验证端点被击中时,身份验证可以安全地识别用户,保留其FB用户ID / FB会话并使用自定义URL方案向您的应用程序返回访问令牌,就像Facebook SDK将执行的操作一样
  • 看起来更好?

    链接地址: http://www.djcxy.com/p/61157.html

    上一篇: REST API for website which uses Facebook for authentication

    下一篇: Images Rotating