Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails从iOS设计OmniAuth Facebook登录_Ios_Ruby On Rails_Authentication_Devise_Omniauth - Fatal编程技术网

Rails从iOS设计OmniAuth Facebook登录

Rails从iOS设计OmniAuth Facebook登录,ios,ruby-on-rails,authentication,devise,omniauth,Ios,Ruby On Rails,Authentication,Devise,Omniauth,我一直在寻找解决这个问题的可靠方法,遇到了这样一个问题:哪种方法与我的困境相匹配,但并不完全匹配 目前,我的iPhone应用程序通过Basic Auth使用Rails API进行身份验证。这只是你简单的,普通的设计验证包。然后,我按照说明为Desive设置omniauth facebook,并在浏览器端实现了这一功能 我不知道怎么做的部分是如何将iPhone端接收到的令牌(通过Facebook iOS SDK)发送到服务器。我希望服务器检查users表,看看那个facebook用户是否已经注册,

我一直在寻找解决这个问题的可靠方法,遇到了这样一个问题:哪种方法与我的困境相匹配,但并不完全匹配

目前,我的iPhone应用程序通过Basic Auth使用Rails API进行身份验证。这只是你简单的,普通的设计验证包。然后,我按照说明为Desive设置omniauth facebook,并在浏览器端实现了这一功能


我不知道怎么做的部分是如何将iPhone端接收到的令牌(通过Facebook iOS SDK)发送到服务器。我希望服务器检查users表,看看那个facebook用户是否已经注册,如果没有注册,则为他创建一个帐户。然后,我认为服务器将生成一个随机密码并将其发送回客户端设备,以便我可以保持相同的基本身份验证策略。这是实现web应用程序和iPhone应用程序单点登录的正确方法吗?如何修改服务器端包以支持通过手机发送的令牌进行身份验证

您是否考虑过让您的应用程序成为Oauth2提供商

我自己并没有这样做,但经过一些挖掘,似乎奥普拉和门卫是解决这个问题的两个可能的方法

看起来opro与Desive配合得很好:

#inside initializers/opro.rb
Opro.setup do |config|
  config.auth_strategy = :devise
end

我很想看看这对你有什么好处,我想你的计划是对的。我们在应用程序和Web服务中已经做到了这一点

这些应用程序使用RESTAPI、HTTPS上的基本身份验证、服务器生成的密码,所有这些都是在没有Desive的情况下实现的。控制器中有一个方法是所有API控制器继承的,这是所有API方法的before\u操作,它调用“authenticate\u或\u request\u with_http\u 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
类ApiController
这样可以处理大多数请求

我们还有一个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
class用户控制器
但是,Web应用程序的所有控制器都继承自WebappController并使用Desive


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

您可能想看看这里:


使用Rails/Desive和iOS看起来是一种相对轻松的方式。我肯定计划在我的下一个项目中使用它。

您可以将通过Facebook iOS SDK收集的访问令牌发送到您的API,并通过使用该令牌在Facebook API上调用/me来检查令牌是否有效以及用户是否存在。如果API上存在从fb/me调用返回的有效令牌和邮件地址,请让iOS应用程序登录,如果令牌有效但用户不存在,请注册该用户。这些评论中的某些内容可能有用,但这不是一个解决方案,因为他不可避免地需要在Android上使用它。好的解决方案是跨移动平台。