如何创建一个让用户自动登录到设备/导轨的链接?

Ped*_*des 5 email ruby-on-rails devise ruby-on-rails-4

我试图让注册用户在我的网站上执行一些操作,所以我想通过电子邮件向他们发送一个直接指向此操作的链接。

问题是我希望他们在单击此链接时自动登录。

我可以做一些显而易见的事情,例如创建一个独特的令牌并将其通过 url 传递,mysite.com/my_funky_action?login_bypass_token=af123fa127ba32但这在我看来是一个“以前多次解决”的问题

那么,有一种简单的方法可以使用 rails / devise 来做到这一点吗?我搜索了设计文档但没有成功。

Ped*_*des 3

使用设备可恢复的代码作为基础,我这样做了

模型:

class User < ActiveRecord::Base
    def set_login_bypass_token
        raw, enc = Devise.token_generator.generate(User, :login_bypass_token)
        self.login_bypass_token = enc
        self.login_bypass_token_set_at = Time.now.utc
        self.save(validate: false)
        raw
     end

     def self.by_bypass_token(token)
         original_token = Devise.token_generator.digest(self, :login_bypass_token, token)
         User.find_by(:login_bypass_token => original_token)
     end
end
Run Code Online (Sandbox Code Playgroud)

邮寄者:

class SomeMailer < ActionMailer::Base
    def send_something
        ...
        @login_bypass_token = @user.set_login_bypass_token
        ...
    end
end
Run Code Online (Sandbox Code Playgroud)

应用程序控制器:

class ApplicationController < ActionController::Base
    layout :application_layout

    protect_from_forgery with: :exception
    before_action :bypass_login
    before_action :authenticate_user!

    private
        def bypass_login
            if params[:login_bypass_token]
                user = User.by_bypass_token(params[:login_bypass_token])
                sign_in(user, :bypass => true) if user
                redirect_to request.path
            end
        end
end
Run Code Online (Sandbox Code Playgroud)

电子邮件模板(haml 格式)

= link_to 'View this awesome page without login!', awesomeness_url(login_bypass_token: @login_bypass_token)
Run Code Online (Sandbox Code Playgroud)