Rails Devise OmniAuth Facebook登陆来自iOS

23

我一直在寻找一个解决方案,解决我目前面临的问题。我看到了 这个SO 问题,它有点符合我的问题,但并不完全相同。

目前,我的iPhone应用程序通过基本认证与我的Rails API进行身份验证。这只是您简单的,常见的devise认证包。然后,我按照说明设置了omniauth-facebook适用于devise,并在浏览器端成功实现了该功能。

我无法弄清楚如何将从Facebook iOS SDK接收到的令牌发送到服务器。我希望服务器检查用户表,以查看该Facebook用户是否已注册,并为其创建一个帐户(如果尚未注册)。然后,我想服务器会生成一个随机密码并将其发送回客户端设备,以便可以保持相同的基本身份验证策略。这是实现Web应用程序和iPhone应用程序的单一登录的正确方法吗?如何修改服务器端包以支持通过手机发送的令牌进行身份验证?


您可以通过Facebook iOS SDK收集访问令牌并将其发送到您的API,通过调用Facebook API上的/me来检查令牌是否有效以及用户是否存在。如果令牌有效且从您的fb/me调用返回的电子邮件地址存在于您的API上,则允许iOS应用程序登录;如果令牌有效但用户不存在,则注册该用户。 - Ahmet Aygun
也许这些评论中的某些内容会有用 https://gorails.com/forum/mobile-app-with-devise-facebook-omniauth - Daniel Viglione
3个回答

4

这不是一个解决方案,因为他最终也需要让它在 Android 上运行。好的解决方案应该是跨移动平台的。 - Daniel Viglione

2
你考虑过将你的应用程序设置为Oauth2提供程序吗?
我自己没有做过这个,但是经过一些研究,opro和doorkeeper似乎是解决这个问题的两个可能的解决方案。

https://github.com/opro/opro https://github.com/doorkeeper-gem/doorkeeper

看起来 Opro 与 Devise 配合得相当不错。
#inside initializers/opro.rb
Opro.setup do |config|
  config.auth_strategy = :devise
end

一定很想看看这对你会有什么结果。

0

我认为你有正确的计划。我们在我们的应用程序和Web服务中完全实现了这一点。

应用程序使用REST API,基本身份验证通过HTTPS,由服务器生成密码,所有这些都是在没有Devise的情况下实现的。控制器中有一种方法,所有API控制器都继承自它,它是所有API方法的before_action,并且调用'authenticate_or_request_with_http_basic'

class ApiController < ActionController::Base
  before_action :authenticate_api
  def authenticate_api
    authenticate_or_request_with_http_basic do |username, password|
      # check server-generated password
    end
  end
end

这样就处理了大多数请求。

我们还有一个API控制器操作,可以从设备上注册一次,以获取由服务器生成的密码:

class UsersController < ApiController
  skip_before_action :authenticate_api, only: [:register_fb]

  def register_fb
    graph = Koala::Facebook::API.new(params.require("access_token"))
    profile = graph.get_object("me?fields=email,first_name,last_name")
    # then go on to look up user if already exists, or create
    # ...  return server-generated password
  end
end

然而,Web应用程序中的所有控制器都继承自WebappController并使用devise。

因此,用户对象上有两个密码(一个用于Web,一个用于移动设备),以及Facebook ID和我们自己的用户ID,这是我们用于身份验证的ID。


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