rails中的多个令牌和多个提供程序身份验证

时间:2015-10-07 19:26:15

标签: ruby-on-rails api authentication token restful-authentication

我正在尝试基于Ruby on Rails 4.2.4为我的RESTful API实现令牌认证系统

我正在考虑制作三个独立的模型/表格:

  • 用户表:包含与身份相关的信息,例如姓名,电子邮件,个人资料图片......
  • 身份验证表:包含有关用户身份验证的信息,例如提供商名称(电子邮件或Facebook),加密密码或第三方提供商访问令牌以及其他oauth内容。
  • 令牌表:存储经过身份验证的用户的所有令牌。我需要从用户分离令牌,因为每个用户都可以从多个设备登录,我不希望如果用户从桌面应用程序注销,它也会注销移动应用程序。

这些是我的模特:

模型/ user.rb

if ( ! $dbh->ping ) { print "Unable to connect to database\n" } ;

模型/ token.rb

class User < ActiveRecord::Base
   has_many :authentications
   has_many :tokens
end

模型/ authentication.rb

class Token < ActiveRecord::Base
  belongs_to :user
end

我不确定如何构建我的控制器以处理令牌和身份验证生成以及帐户链接。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

也许来自lucatironi的教程 - http://lucatironi.net/tutorial/2015/08/23/rails_api_authentication_warden/ - 可能是您的完美指南。它使用令牌颁发者服务进行多个身份验证会话和独立注销。

答案 1 :(得分:0)

我不明白为什么你将令牌分开,即使他们使用不同的设备他们使用不同的会话,所以从一个登出就不会从另一个登出。

建议您通过标头传递给令牌,然后在application_controller中执行过滤器,该过滤器将在任何验证令牌的请求之前运行:

class ApplicationController < ActionController::Base
before_filter :restrict_access

def restrict_access
  authenticate_or_request_with_http_token do |token, options|
    @user = Token.where(token: token).first.try(:user)
  end
end

end

然后只有另一个过滤器来检查@user是否存在,否则发送401。

也是在用户找到为此最终用户生成会话之后。

答案 2 :(得分:0)

如果您使用的是authenticate_or_request_with_http_token do |token, options|,则可以通过用逗号分隔请求值,将更多密钥发送到“授权”标头中的“选项”参数中。即

Authorization: Token aaa, token2=bbb, token3=ccc

这将解析并给您:

token = aaa
options = { 'token2' => 'bbb', 'token3' => 'ccc' }