【问题标题】:Multiple tokens and multiple providers authentication in railsRails 中的多个令牌和多个提供者身份验证
【发布时间】:2016-01-05 04:33:26
【问题描述】:

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

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

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

这些是我的模型:

models/user.rb

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

models/token.rb

class Token < ActiveRecord::Base
  belongs_to :user
end

models/authentication.rb

class Authentication < ActiveRecord::Base
  belongs_to :user
end

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

提前感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

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

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

    这会解析并给你:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 即使您不使用 Warden,您也可以通过几次手动调用进行身份验证和授权来进行相同的设置。它至少提供了一个很好的基础。
      【解决方案3】:

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

      建议您通过标头传递给令牌,然后在 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。

      还在用户找到后为该最终用户生成会话。

      【讨论】:

      • 我需要多个令牌,因为我试图避免会话,因为它违反了 RESTful API 的无状态原则。将访问令牌存储在 cookie 或任何地方是客户的工作。因此,如果用户注销,服务器会使用于请求注销的令牌无效。如果每台设备都具有相同的令牌,它们将同时注销
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多