我有一个使用Facebook身份验证登录用户的网站。它使用oAuth 2.0服务器端流进行身份验证,一切正常。
我正在为同一个网站开发一个iPhone应用程序,并希望允许用户使用FB身份验证通过iPhone应用程序登录该网站.Facebook iOS SDK提供了使用客户端流程进行身份验证的机制,其中在我的iPhone应用程序中获取访问令牌。
<击> 现在要使用我的服务器对用户进行身份验证,并将访问令牌提供给我的服务器,我想到将此访问令牌发送到我的服务器(通过https)并根据我的数据库验证用户并设置我自己的会话相关cookie。这是首选或建议的方法吗?当我要求离线访问权限并让我的webapp直接与我的服务器上的FB用户帐户交互时,我需要服务器上的访问令牌。
对我来说更简单的选择就是在我的iPhone应用程序上使用服务器端流程进行身份验证,因为没有什么新的工作要做,服务器端代码对于网站来说是相同的iPhone应用程序那可能吗?
击>
我无法使用客户端身份验证并将访问令牌传递给我的服务器以对我的系统进行身份验证,并且还要存储以供进一步使用。为客户端身份验证接收的访问令牌与服务器端身份验证令牌完全不同,并且两者不能互换使用。我将不得不使用服务器端身份验证。
<击> 一个解决方案(provided here - 在问题的第一个评论中)是使用UIWebView并模拟服务器端流程。以下评论提到了这种方法存在的问题,我无法解决。 击>
这已通过检查登录后webview重定向到的URL来解决。
另一个问题是,我的iPhone应用程序也进行了一些客户端交互(如FBShare,写入朋友的墙壁等)。如果我使用模拟服务器端身份验证,我将不得不为这些交互执行另一个客户端身份验证,或采取痛苦的方法,甚至通过我的服务器路由这些操作。后者绝对不是优选的。我该怎么做?我可以避免这种双重登录,因为这将是非常糟糕的用户体验吗?
答案 0 :(得分:0)
我处于类似情况。我有一个iOS原生应用,需要知道用户是谁。
我有一个网站(RoR),使用Devise,我可以通过它的OmniAuth gem登录/创建Facebook / Twitter帐户。
然而,对于Facebook和Twitter,似乎我必须在每个中创建两个条目,一个用于网站,一个用于应用程序。
这些是每个的单独API密钥。
对于iOS应用程序,我提出的唯一方法是: *如果用户想通过Facebook的Twitter授权/创建帐户,则通过UIWebView将其发送到网站进行登录。
来自iOS的任何推文/ FB帖子实际上都会通过网站上的API发布给每个人,这些API将使用用户的访问令牌代表他们发布推文。
问题是,我宁愿不喜欢Webviews的登录。如果有人有任何建议,我会全力以赴。
答案 1 :(得分:0)
“我不能使用客户端身份验证并将访问令牌传递给我的服务器以对我的系统进行身份验证,并且还要存储以供进一步使用。用于客户端身份验证的访问令牌与服务器端身份验证令牌完全不同,这两者不能互换使用。我将不得不使用服务器端身份验证。“
我刚刚发现它正好相反。客户端流和服务器端流认证生成的访问令牌完全相同。它们是“可互换的”,实际上一旦获得令牌,只要用户仍然登录并且令牌尚未过期,它就可以在任何地方使用。这很有效。
curl "https://graph.facebook.com/{the user id}/friends?access_token={the token}
答案 2 :(得分:0)
我无法使用客户端身份验证并将访问令牌传递给我的服务器,以便对我的系统进行身份验证,并且还可以存储以供进一步使用。
根据Facebook的Securing Requests - Verifying Graph API Calls with appsecret_proof页面:
访问令牌是便携式的。可以通过Facebook的SDK获取客户端生成的访问令牌,将其发送到服务器,然后代表该人从该服务器进行调用。
所有这些都说,我很困惑,SDK不允许使用3脚OAuth流,返回访问代码而不是令牌,尽管他们出于安全原因建议这样做。