对于使用Facebook iOS SDK的混合SSO场景,为我们自定义用户logging生成密码/密钥的最佳方式是什么?

所以我的意图是在我的iOS应用程序login,允许我们的标准电子邮件/密码注册,或loginFacebook。 我们还创build其他服务来获取给定用户的应用程序信息,例如https:// url / getPosts / [userId]?userPwd = foo

我已经在Web应用程序中使用fb实现了SSO,但是我对iOS客户端场景中的身份validation的安全性有一些担忧。 与我之前做的主要区别是,在一个networking应用程序,我正在服务器调用Facebook的服务器来获取访问令牌,所以我有理由相信,用户通过身份validation,networking服务器进行了特权呼叫数据库。 在iOS情况下,我有移动客户端应用程序自己做Facebook的身份validation请求,服务器必须相信,从客户端应用程序的这个用户确实是对我们的数据库中匹配的用户logging进行身份validation。

我的问题是如何从iOS SDK中生成一个持久和秘密的唯一密钥,以便我们可以创build数据库中的匹配用户logging并将其与仅与Facebook进行身份validation的用户相关联。 我想这是无缝的,所以用户不必手动填写另一个表单,我们只会自动在我们的数据库中创build这个匹配的用户logging。

我可以插入一个logging到我自己的用户表中,当他们fbDidLogin与Facebook,使用Facebook的ID作为唯一的标识符,和fb访问令牌作为我自己的用户logging的伪密码/密钥。 我必须使用Facebookvalidation访问令牌,以确保它是有效的,然后将其作为用户的密码保存(用户永远不会看到这个密码,它只会在客户端应用程序在API调用期间传递)。 这样,当用户通过iPhone应用程序打电话给我们自己的restAPI时,我们可以使用这个密钥/密码/密钥进行身份validation和授权。

一个可以使整个问题没有意义的方法是只处理客户端应用程序上的授权逻辑,并且在调用我们自己的apis之前,检查是否有一个有效的fb会话,我只用一个应用程序的秘密来保护它,但是这似乎并不安全,因为获得这个秘密授予所有用户的数据授权。 我宁愿在个人用户级授权。 这是正确的select吗? 我对iOS安全有偏见吗?

fb访问令牌过期,所以可能看起来并不耐用,但是如果我启用离线访问,令牌不会过期,但会创build一个令人怀疑的oauth对话窗口。 访问令牌的替代方法是在iOS客户端上使用应用程序密钥对fb Id进行散列,并将其用作我们数据库中的Facebook用户密码。 但是,这又是一个单一的密钥,可能是从iOS客户端应用程序反编译?

在iOS应用程序中deviseFacebook身份validation,同时访问安全的Web服务

这篇文章让我更不喜欢它。 如果我没有弄错,stream程是这样的:

  1. 用户在iOS应用中进行身份validation
  2. iOS应用程序需要身份validation令牌,将其发送到Rails应用程序
  3. Rails应用程序需要身份validation令牌,并将其发送到graph.facebook.com/?auth_token=XXX以在身份validation成功时取回用户。
  4. Rails应用程序获取用户信息,并在自己的数据库表中匹配/创build用户。 将某种身份validation密钥发送回iOS应用程序。
  5. iOS应用程序保存身份validation密钥,以便它可以使用它与rails应用程序进行通信。

让我知道我是否缺less任何东西。

您是否查看过单点login(SSO)的iOS文档? https://developers.facebook.com/docs/guides/mobile/#ios

您可以跨移动设备,canvas和网站共享一个应用ID,并为每个环境使用相同的用户身份validation。

查看: https : //developers.facebook.com/docs/authentication/

Facebook平台提供了多种方式在不同的应用types中使用上述OAuthstream,包括Facebook.com上的网站,应用,移动和桌面应用。

你只需要将用户的Facebook密钥插入到你的数据库,知道它是否与Facebook进行了authentication。 在ios侧使用OAuthauthentication用户把用户密钥发送给您的其他networking服务,并保存与用户的其他信息。