我正在开发一种同时具有桌面网站和本机 iOS 应用程序的产品。我们在两种情况下都为我们的用户提供 Facebook 连接作为登录选项。
我的目的是通过安全的 JSON API 共享相同的 Facebook 令牌,以便在两种情况下使用:当用户登录网络时,令牌存储到我们的后端,以便移动客户端下次运行时,它可以下载令牌并使用它,反之亦然。(*我在问题末尾解释了这种方法的详细推理,对于问题不是必需的。)
问题:当iOS客户端使用token预设一个feed dialog时,如果该token是web使用server-side flow生成的,dialog webview会呈现错误:
“{我的应用名称}出现错误。请稍后再试。”
这是可靠的可重现的:
- 使用服务器端流程生成新的访问令牌。确保您请求 publish_actions 权限,因为您将使用提要对话框。
- 使用隐身浏览器窗口(获取一个空的 cookie 罐),查看 iOS 提要对话框将在其 web 视图中呈现的 m.facebook.com 页面:https ://m.facebook.com/dialog/feed?access_token=SERVER_SIDE_FLOW_ACCESS_TOKEN&app_id =YOUR_APP_ID&redirect_uri=fbconnect%3A%2F%2Fsuccess&sdk=2&display=touch
除了#2,您可以完成所有工作(我已经完成)使用 Facebook SDK 创建一个虚拟 iOS 应用程序,正确实例化它并显示对话框。为了重现错误,直接访问 m.facebook.com 提要 URL 更容易。
如果令牌是由本机 Facebook iOS SDK 发起的身份验证流而不是服务器端身份验证流生成的,则上述提要 URL 可以正常工作,正如预期的那样。
此外,任何一个令牌(移动或服务器生成)都非常适合直接通过图形 api 发布提要项目。问题实际上只是与移动提要对话框有关。
Facebook 是否故意禁止服务器端生成的令牌在移动提要对话上下文中运行?
这是 m.facebook.com 上的提要对话框端点的错误吗?
或者,希望,我做错了什么?
为什么我要分享代币?
- 由于正在删除 offline_access 权限,因此每个客户端(Web 与移动)都可以从让另一个客户端在用户处于活动状态时刷新相同的令牌中受益。这将导致令牌过期的情况减少,因此用户必须从头开始重新进行身份验证的情况也将减少。
- 同样,不会频繁地要求用户批准额外的权限,因为每个客户端都可以从对方的权限增强中受益。