首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Facebook进行身份验证的网站的REST API

使用Facebook进行身份验证的网站的REST API
EN

Stack Overflow用户
提问于 2012-08-22 10:09:48
回答 3查看 40.3K关注 0票数 86

我们有一个网站,唯一的方式登录和验证自己的网站是在Facebook (这不是我的选择)。第一次登录Facebook时,系统会自动为您创建一个帐户。

现在,我们希望为我们的站点创建一个iPhone应用程序,并为其他人创建一个公共应用程序接口来使用我们的服务。

这个问题是关于如何从app/API向我们的网站进行身份验证,分为两个部分:

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

我已经阅读和研究了很多关于REST API认证的标准方法。我们不能使用Basic Auth over HTTPS这样的方法,因为这样的用户没有凭据。像this这样的东西似乎只用于使用API对应用程序进行身份验证。

目前,我能想到的最好的方法是,你在我们的API上点击一个/authorize端点,它重定向到Facebook OAuth,然后重定向回站点,并提供一个‘令牌’,API的用户可以用它来验证后续的请求。

对于我们创建的官方应用程序,我们不一定需要以相同的方式使用

  1. 。那么,与我们的网站对话并验证用户身份的最佳方式是什么?

我知道(我认为)如何使用API (公共)密钥和秘密(私有)密钥对使用我们API的第三方应用程序进行身份验证。然而,当涉及到对使用该应用程序的用户进行身份验证时,我对如何进行身份验证感到相当困惑,因为我们必须验证用户的唯一方式是Facebook。

我觉得我遗漏了一些非常明显的东西,或者不完全理解公共REST API应该如何工作,所以任何建议和帮助都将非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-19 04:55:06

更新:见下文

我也一直在努力思考这个问题。这对我来说还不是完全清楚,但这是我正在考虑的路线。我正在创建一个REST API,我的用户只使用Facebook connect进行身份验证。

在客户端:

  1. 使用Facebook API登录并获取OAUTH2代码。
  2. 将此代码交换为访问令牌。
  3. 在每次调用我的自定义API时,我将包括Facebook用户id和访问令牌。

在API上(对于每个需要用户身份验证的方法):

  1. 使用来自above.
  2. Verify的访问令牌向/me Facebook图发出请求,返回的Facebook用户id与上面传递给我的API的用户id相匹配。
  3. 如果访问令牌已过期,则需要进行其他通信。

我还没有对此进行测试。听起来怎么样?

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

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

在客户端:

Facebook

  • 使用Facebook API登录并获取OAUTH2 code.

  • Exchange此代码用于访问token.

  • Request来自我的API的访问令牌,包括Facebook令牌作为参数

在API上

使用Facebook访问令牌接收对facebook Facebook图的请求

  1. 使用Facebook访问令牌
  2. 验证Facebook用户是否存在并与my database
  3. Create我自己的访问令牌中的用户匹配,保存该用户并将其返回给客户端,以便从此时开始使用forward
票数 100
EN

Stack Overflow用户

发布于 2016-05-23 02:17:37

这是我使用JWTs (JSON Web Tokens)的实现,基本上类似于Chris的更新答案。我用过Facebook JS SDK和JWT。

这是我的实现。

  1. Client:使用Facebook JS SDK登录,通过调用Facebook endpoint.
  2. MyAPI:接收access token,从我的接口中获取access token.
  3. Client: Request JWT,如果access token有效,则调用Facebook API.
  4. MyAPI:/me端点进行验证,从数据库中查找用户,如果存在则登录。创建一个以必填字段为有效负载的JWT,设置一个过期时间,使用私钥签名并发送回client.
  5. Client:。JWT存储在本地storage.
  6. Client:中,将令牌(步骤5中的JWT )与下一个API调用的请求一起发送。
  7. MyAPI:使用密钥对token进行验证,如果token有效,则将token交换为新的token,并将其与接口响应一起发送回客户端。(之后这里没有外部API调用来验证令牌)如果令牌无效/过期,则请求客户端再次进行身份验证并从1
  8. Client重复,将存储的令牌替换为新的令牌,并将其用于下一次API调用。一旦令牌过期,令牌就会过期,从而撤销对API的访问权限。

每个令牌都使用一次。

阅读更多关于安全性和JWT的答案

How secure is JWT

If you can decode JWT how are they secure?

JSON Web Tokens (JWT) as user identification and authentication tokens

票数 15
EN

Stack Overflow用户

发布于 2012-09-04 01:38:41

我也在尝试回答同样的问题,最近我读了很多书……

我不会得到“答案”,但事情对我来说变得更清晰了。你看过the article you mentioned里的评论了吗?我发现他们真的很有趣,很有帮助。

因此,鉴于自第一篇文章撰写以来,事情发生了怎样的变化,我认为我将这样做:

  • HTTPS everywhere -这可以让你忘记HMAC,签名,随机数,...

  • 使用OAuth2:

代码语言:javascript
复制
- When authentication requests come from my own apps/website, use this 'trick' (or a variation of it) described in a [reply to the article](http://ahmetalpbalkan.com/blog/designing-a-secure-rest-api-with-oauth2-you-can-be-proud-of/) mentioned before.

所以我会提供一个带有“

代码语言:javascript
复制
- In my case, I have two types of users: those with classic login/password credentials and those who have signed up with Facebook Connect.

登录”按钮的常规登录表单。如果用户使用他的“经典”凭据登录,我只需使用grant_type=password将这些凭据发送到我的OAuth2端点。

如果他选择通过Facebook登录,我认为这将是一个分两步走的过程:

代码语言:javascript
复制
    - First, use Facebook iOS SDK to open an FBSession
    - When that's done and the app is given back control, there should be a way to get a Facebook ID for that user. I'd send this ID alone to my OAuth2 endpoint with an [extension grant](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-30#section-4.5) understood by my server as "using an FB User ID".

请注意,我仍在对所有这些东西进行大量研究,所以这可能不是一个完美的答案……可能甚至不是正确的!但我认为这将是一个很好的起点。使用Facebook身份验证的“扩展授权”的想法可能涉及到必须注册它才能正确执行操作?我不是很确定。

无论如何,我希望我能为您提供一点帮助,并且至少可以展开讨论,找到这个问题的最佳解决方案:)

更新

Facebook登录并不像评论中指出的那样是一种解决方案:任何人都可以发送任意用户ID并以此用户身份登录到API上。

这样做怎么样:

  • 显示一个带有"Facebook login“按钮的登录表单
  • 如果选择了这种登录方法,行为有点像Facebook SDK:从你的认证服务器打开一个网页,这将启动Facebook登录。
  • 一旦用户登录,Facebook将使用你的重定向网址进行确认;
  • 当命中身份验证端点时,身份验证可以安全地识别用户,保留其FB用户ID/FB会话,并使用自定义URL方案将访问令牌返回到应用程序,就像Facebook SDK处理

一样

看起来好多了?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12065492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档