2

我有一个通过 oauth2 devise/warden/omniauth 与 facebook 集成的应用程序。一切正常,我对此感到满意。

现在我正在尝试将应用程序与新的 facebook appcenter 集成,这基本上似乎解决了让用户在访问我的网站之前进行预身份验证的问题。

基本上,用户以类似的 url 结尾

/?fb_appcenter=1&code=xxxxxx

但是设计'omniauthcontroller 正在等待不同的网址,即

/users/auth/facebook/callback

我尝试执行一个简单的重定向,将代码查询参数传递到回调 url,但我收到“无效凭据”错误。

我认为问题可能是在 oauth2 facebook 策略中用于获取 access_token 的调用中使用的 redirect_uri 不对应于 facebook 本身用于生成初始代码的那个,但我不知道我应该如何改变那。

有人有建议或过去解决过这个问题吗?

值得一提的是,我使用的是旧版本的设计(1.4)和omniauth(0.3),但暗示了总体方向应该是什么,即使使用新版本,也足够了。

4

2 回答 2

0

在将代码交换为令牌时,代码是在经过身份验证的引用中创建的,该redirect_uri值需要与用户被带到的 URL 相同。App Center 文档中对此效果有注释:

使用查询字符串设置时的特殊注意事项:

如果您想在 App Center 中使用服务器端身份验证流程,请务必确保在将代码交换为访问令牌时正确传递了 redirect_uri 参数。您应该将 redirect_uri 参数设置为您网站的点击后到达 URL。在大多数情况下,URL 看起来像:

http://www.example.com/?fb_appcenter=1&fb_source=search&code=CODE_HERE 因此,您应该将 redirect_uri 设置为相同的值。请确保此逻辑是动态的,因为附加到您的点击后到达网址的查询参数可能会发生变化。

于 2012-07-26T11:50:07.193 回答
0

事实证明这对于旧版本的omniauth 是不可能的,因为redirect_uri它是硬编码的,但是一个合理的技巧是将用户重定向到标准的auth 回调(例如/auth/facebook/callback)。

这将再次对用户进行身份验证,但由于他已经给了你凭据,它只会通过。

另一种方法,也是我最终做的,是从 OA 的 facebook 策略中获取代码并重新实现一些 OAuth2 功能,基本上是在您正在使用的登录页面中将代码与访问令牌交换。

于 2012-09-05T14:13:55.253 回答