我们有一个网站,唯一的方式登录和验证自己的网站是在Facebook (这不是我的选择)。第一次登录Facebook时,系统会自动为您创建一个帐户。
现在,我们希望为我们的站点创建一个iPhone应用程序,并为其他人创建一个公共应用程序接口来使用我们的服务。
这个问题是关于如何从app/API向我们的网站进行身份验证,分为两个部分:
我已经阅读和研究了很多关于REST API认证的标准方法。我们不能使用Basic Auth over HTTPS这样的方法,因为这样的用户没有凭据。像this这样的东西似乎只用于使用API对应用程序进行身份验证。
目前,我能想到的最好的方法是,你在我们的API上点击一个/authorize端点,它重定向到Facebook OAuth,然后重定向回站点,并提供一个‘令牌’,API的用户可以用它来验证后续的请求。
对于我们创建的官方应用程序,我们不一定需要以相同的方式使用
我知道(我认为)如何使用API (公共)密钥和秘密(私有)密钥对使用我们API的第三方应用程序进行身份验证。然而,当涉及到对使用该应用程序的用户进行身份验证时,我对如何进行身份验证感到相当困惑,因为我们必须验证用户的唯一方式是Facebook。
我觉得我遗漏了一些非常明显的东西,或者不完全理解公共REST API应该如何工作,所以任何建议和帮助都将非常感谢。
发布于 2012-11-19 04:55:06
更新:见下文
我也一直在努力思考这个问题。这对我来说还不是完全清楚,但这是我正在考虑的路线。我正在创建一个REST API,我的用户只使用Facebook connect进行身份验证。
在客户端:
在API上(对于每个需要用户身份验证的方法):
我还没有对此进行测试。听起来怎么样?
--更新: 2014年7月27日回答问题
我只在登录时使用上述交换一次。一旦我确定了哪个用户正在登录,我就创建了自己的访问令牌,从那时起就可以使用该令牌了。所以新的流程看起来像这样...
在客户端:
在API上
使用Facebook访问令牌接收对facebook Facebook图的请求
发布于 2016-05-23 02:17:37
这是我使用JWTs (JSON Web Tokens)的实现,基本上类似于Chris的更新答案。我用过Facebook JS SDK和JWT。
这是我的实现。
/me
端点进行验证,从数据库中查找用户,如果存在则登录。创建一个以必填字段为有效负载的JWT,设置一个过期时间,使用私钥签名并发送回client.每个令牌都使用一次。
阅读更多关于安全性和JWT的答案
If you can decode JWT how are they secure?
JSON Web Tokens (JWT) as user identification and authentication tokens
发布于 2012-09-04 01:38:41
我也在尝试回答同样的问题,最近我读了很多书……
我不会得到“答案”,但事情对我来说变得更清晰了。你看过the article you mentioned里的评论了吗?我发现他们真的很有趣,很有帮助。
因此,鉴于自第一篇文章撰写以来,事情发生了怎样的变化,我认为我将这样做:
- 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.
所以我会提供一个带有“
- 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登录,我认为这将是一个分两步走的过程:
- 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上。
这样做怎么样:
一样
看起来好多了?
https://stackoverflow.com/questions/12065492
复制相似问题