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

Posted

技术标签:

【中文标题】对于使用 Facebook iOS SDK 的混合 SSO 场景,为我们自己的自定义用户记录生成密码/密钥的最佳方式是啥?【英文标题】:For a hybrid SSO scenario using the Facebook iOS SDK, what's the best way generating a password/key for our own custom user records?对于使用 Facebook iOS SDK 的混合 SSO 场景,为我们自己的自定义用户记录生成密码/密钥的最佳方式是什么? 【发布时间】:2011-09-09 12:46:36 【问题描述】:

所以我的意图是在我的 ios 应用程序中登录,允许我们的标准电子邮件/密码注册,或使用 Facebook 登录。我们还在创建休息服务来获取给定用户的应用程序信息,例如https://url/getPosts/[userId]?userPwd=foo

我之前在 Web 应用程序中使用 fb 实现了 SSO,但我对 iOS 客户端场景中的身份验证安全性有些担忧。与我之前所做的主要区别在于,在 Web 应用程序中,我正在对 Facebook 进行服务器到服务器调用以获取访问令牌,因此我有理由确信用户已通过身份验证,并且 Web 服务器对数据库。在 iOS 案例中,我有移动客户端应用程序自己发出 Facebook iOS 身份验证请求,服务器必须以某种方式相信来自客户端应用程序的该用户确实根据我们数据库中的匹配用户记录进行了身份验证。

我的问题是如何从 iOS SDK 生成持久且秘密的唯一密钥,以便我可以在我们的数据库中为仅通过 Facebook 进行身份验证的用户创建和关联匹配的用户记录。我希望这是无缝的,这样用户就不必手动填写另一个表格,我们只需在我们的数据库中自动创建这个匹配的用户记录。

当他们使用 Facebook 进行 fbDidLogin 时,我可以在我自己的用户表中插入一条记录,使用 Facebook Id 作为唯一标识符,并将 fb 访问令牌作为我自己的用户记录的伪密码/密钥。在将其保存为用户密码之前,我必须使用 Facebook 验证访问令牌以确保其有效(用户永远不会看到此密码,它只会在 api 调用期间由客户端应用程序传递)。这样当用户通过 iPhone 应用程序调用我们自己的 rest api 时,我们可以使用这个 secret/pwd/key 进行身份验证和授权。

使整个问题变得毫无意义的另一种方法是仅处理客户端应用程序上的授权逻辑,并在调用我们自己的 api 之前检查是否存在有效的 fb 会话,我只使用单个应用程序范围内的 API 来保护它秘密,但这似乎并不安全,因为获得该秘密会授权所有用户的数据。我宁愿在个人用户级别授权。那是正确的选择吗?我是否对 iOS 安全感到偏执?

fb 访问令牌已过期,因此可能看起来不耐用,但是如果我启用离线访问,该令牌不会过期,但会创建一个看起来更吓人的 oauth 对话窗口。访问令牌的替代方法是使用 iOS 客户端上的应用程序密钥对 fb Id 进行哈希处理,并将其用作我们数据库中的 Facebook 用户密码。但是,这又是一个可以从 iOS 客户端应用程序反向编译的密钥?

【问题讨论】:

【参考方案1】:

Design for Facebook authentication in an iOS app that also accesses a secured web service

这篇文章让我更加了解它。如果我没记错的话,流程是这样的:

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

如果我遗漏了什么,请告诉我。

【讨论】:

您好!在第 4 点和第 5 点中,当您说“身份验证密钥”时,您是指会话 cookie 之类的东西吗?现在我正在尝试将 facebook 登录集成到我的应用程序中,目前我的客户端-服务器架构使用基本的身份验证和 ssl。我可以将 faacebook 登录集成到我当前的模型中吗?在此先感谢:) 身份验证密钥就像一个 api 密钥,仅适用于您的 rails 应用程序。它可以帮助您的 ios 应用程序和 rails 应用程序安全地通信,因此您可以进行更改,例如修改用户信息等。只需在您的用户数据库中为 api_key 添加一列,并在创建新用户时生成它。 justinbritten.com/work/2009/05/…【参考方案2】:

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

您可以在移动设备、画布和网站之间共享一个应用 ID,并且相同的用户身份验证适用于每个环境。

签出:https://developers.facebook.com/docs/authentication/

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

【讨论】:

除了访问令牌(access_token 参数)之外,响应还包含令牌过期前的秒数(expires 参数)。令牌过期后,您将需要重新运行正常步骤以生成新代码和 access_token,但如果用户已经授权您的应用程序,则不会再次提示他们这样做。如果您的应用需要一个无限期的访问令牌(可能在用户不使用您的应用后代表用户执行操作),您可以请求offline_access 权限。 嗨,Charles,是的,我已经查看了该文档,并且在 Web 环境中实现了类似的场景。这些文档主要关注您使用 fb 作为用户提供者的场景,并不一定解决组合混合用户的最佳方法。我主要关心的是为了 iOS 客户端应用程序的安全性,我可能需要进行哪些更改。在一个网络应用程序中,我只需对 fb 进行服务器到服务器调用以获取身份验证令牌,因此可以合理地保证安全性。但是,在 iOS 案例中,客户端正在拨打电话,我对这种情况下的安全性有些担忧 您应该能够重新获取身份验证令牌服务器端,只要用户没有取消您的应用程序的身份验证或卸载您的应用程序。如果他们有,您可以向 iOS 客户端发送失败消息,然后让用户重新验证。最好的做法是保存您自己的用户 ID 数据库并将 FB 用户连接到您的内部表示 - 它为您提供 FB UID 和您自己的 UID 之间的一级间接性。您也可以通过这种方式在您的数据库中使用 FK 约束。对于非 FB 用户,您需要构建自己的身份验证——最好的办法是使用 reg 插件。或者只使用 FB 用户! Charles,这一切都取决于您所说的“重新获取身份验证令牌服务器端”。但我在文档中找不到如何做到这一点?你能指出我正确的地方吗?我所需要的(我和 MonkeyBonkey 有类似的问题)是一种在服务器端确保用户的 Facebook 登录仍然是最新的方法,但我找不到这个。 我想这就是你想要的:developers.facebook.com/docs/mobile/ios/build/#extend_token【参考方案3】:

您只需将用户 Facebook 密钥插入您的数据库即可知道其是否已通过 Facebook 身份验证。在 ios 端使用 OAuth 验证用户获取用户密钥将其发送到您的其余网络服务并与用户其他信息一起保存。

【讨论】:

我假设您是说密钥是我们从 fb 取回的用户的身份验证令牌? authtoken 过期的场景呢?我想我可以在每次用户刷新他们的 Facebook 会话时更新我们的用户数据库中的 authToken... auth 令牌不会像你说的那样过期.. 密钥 m 说的是 32 后密钥你可能知道它。如果你将它插入数据库,然后你可以像墙柱一样用它执行所有的 nessesry 表演。 (即:其图形 api 请参阅 developer.facebook.com 了解更多信息) 我也有同样的担忧。假设我使用 facebook 登录并检索可以与我自己的用户数据库匹配的 UID。如果我想修改我自己的用户表上的属性,我是否只需使用匹配的 UID 发布给用户?这是否意味着任何人都可以在知道 UID 的情况下修改我的 User 表? 我没有收到您的问题,请说明。

以上是关于对于使用 Facebook iOS SDK 的混合 SSO 场景,为我们自己的自定义用户记录生成密码/密钥的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Facebook iOS 登录 API 2.0 (SDK 3.15.1)

Facebook iOS SDK 登录原生和 UIWebView 登录

如何在 AppDelegate 中使用 Parse 正确设置 Facebook iOS SDK?

Facebook iOS sdk,需要按两次登录按钮

iOS Facebook SDK:性别被本地化

IOS(Facebook SDK)无法访问public_profile权限