使用Devise和Omniauth开发iOS/Android应用程序

27
我已经使用Devise和Omniauth为我的Rails应用程序设置了用户认证。 现在我想知道如何在我要创建的Android和iPhone应用程序中使用相同的认证。 我应该使用我的/auth/facebook的移动版本,还是直接从应用程序发送请求? 这是一个非常普遍的问题,但我找不到任何可以参考的地方。 编辑:我刚刚向应用程序添加了令牌认证以与RESTful API一起使用,我只是缺少Omniauth / Facebook-token部分。

我已经在我的Android应用程序中设置了Facebook SDK,但似乎我得到的令牌与我在Rails应用程序数据库中拥有的令牌不同,因此我无法将它们进行比较以验证我的用户?! - rnaud
1个回答

38

好的,我来回答自己的问题。

如果你使用Facebook SDK,那么单点登录在设备上运行得非常好,但是,你所收到的令牌与你在Rails应用程序中将要收到的令牌不同。 显然,Facebook根据支持情况创建不同的令牌。

因此,我所做的是:一旦我在Android设备上接收到令牌,我会通过URL将其发送到我的Rails应用程序:

http://myapp/check_mobile_login?token=FB_MOBILE_TOKEN

这段代码会被我的应用控制器捕获,并使用fb_graph gem中的Token获取用户数据。如果Token有效,我将收到一些信息。然后我检查我的数据库,如果我找到相同的UID,则我的用户已经通过验证,我将向他发送Devise的认证Token。

以下是示例代码:

    def check_mobile_login
        token = params[:token]

        user = FbGraph::User.me(token)
        user = user.fetch

        logged = User.find_by_uid(user.identifier)

        respond_to do |format|
            format.html # index.html.erb
            format.json { render :json => logged.authentication_token }
        end
    end

如果有更好的解决方案,我很乐意听取 :)


嗨,我正在尝试做同样的事情,想知道你在哪里“sign_in”到设备中,以便认证令牌将在你的Rails应用程序内生成? - refaelos
在您的用户模型中的Devise声明中添加:token_authenticatable,然后每个新用户都将获得一个“authentication_token”,您可以使用它来登录您的下一个请求。 - rnaud
是的,但如果令牌过期,您必须“登录”才能重新生成令牌。您还必须“登录”以使用户成为当前用户。 - refaelos
1
https://github.com/SoapSeller/omniauth-facebook-access-token 可能对任何谷歌搜索者有用。它似乎遵循相同的omniauth模式,但允许在回调到服务器时使用access_token并使服务器检索用户详细信息。 - Zachary Moshansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接