RailsdeviseOmniAuth Facebook从iOSlogin

我一直在寻找这个问题的可靠解决scheme,并且遇到了这样一个与我的困境相匹配的问题,但并不完全一样。

目前我有我的iPhone应用程序通过基本身份validation与我的Rails API进行身份validation。 这只是您简单的一stream的deviseauthentication软件包。 然后我按照说明设置omniauth-facebook的devise,并得到了在浏览器端的工作。

我无法弄清楚如何做的部分是如何将在iPhone端(通过Facebook的iOS SDK)收到的令牌发送到服务器。 我希望服务器检查用户表,看看这个Facebook用户是否已经注册,并为他创build一个帐户,如果他没有。 然后,我想服务器会生成一个随机密码,并将其发送回客户端设备,这样我就可以保持相同的基本身份validation策略。 这是一个Web应用程序和iPhone应用程序的单一login的正确方法吗? 如何修改服务器端软件包以支持通过手机发送的令牌进行身份validation?

你可能想看看这里:

开源:宣布devise – iOS的简化authentication

它看起来像一个相对轻松的方式来使用Rails / Devise和iOS。 我绝对计划在下一个项目中使用它。

你有没有考虑让你的应用程序是一个Oauth2提供者?

我自己并没有这样做,但经过一番挖掘,看起来像opro和门卫是两个可能的解决办法。

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 

绝对有兴趣看看这是怎么回事

我认为你有正确的计划。 我们已经在我们的应用程序和Web服务中完成了这一步。

应用程序使用REST API,基于HTTPS的基本身份validation,服务器生成的密码,所有这些都是在没有 Devise的情况实现的。 在控制器中有一个方法,所有的API控制器都是inheritance的,也就是所有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应用程序,所有控制器都从WebappControllerinheritance并使用devise。

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