如何创建一个自动将用户登录到devise / rails的链接?

时间:2015-05-31 20:58:11

标签: ruby-on-rails email ruby-on-rails-4 devise

我试图让注册用户在我的网站上采取一些行动,所以我想通过电子邮件直接发送一个链接到这个动作。

问题是我希望在点击该链接时自动登录。

我可以做一些明显的事情,比如创建一个独特的令牌并通过url mysite.com/my_funky_action?login_bypass_token=af123fa127ba32传递它,但这在我看来是一个问题"在#34之前解决了很多次;

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

2 个答案:

答案 0 :(得分:1)

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

模型:

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

邮件收发器:

class SomeMailer < ActionMailer::Base
    def send_something
        ...
        @login_bypass_token = @user.set_login_bypass_token
        ...
    end
end

application_controller:

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

电子邮件模板(以haml为单位)

= link_to 'View this awesome page without login!', awesomeness_url(:login_bypass_token => @login_bypass_token)

答案 1 :(得分:0)

一般来说,这不是一件好事。

如果您不使用令牌,则意味着您需要构建一个包含明确电子邮件地址的路径,例如

http://my_app.com/special_action?email=john@sample.com

鉴于此,任何人都可以通过发送如上所述的网址来替换任何注册用户,替换他们想要的任何电子邮件。

寻找令牌,确保它在使用时或在您可以逃脱的最短时间后到期。