我试图让注册用户在我的网站上执行一些操作,所以我想通过电子邮件向他们发送一个直接指向此操作的链接。
问题是我希望他们在单击此链接时自动登录。
我可以做一些显而易见的事情,比如创建一个独特的 token 并将其通过 url mysite.com/my_funky_action?login_bypass_token=af123fa127ba32
传递。但这在我看来是一个“以前解决过很多次”的问题
那么,有一种简单的方法可以使用 rails/devise 来做到这一点吗?我搜索了设计文档但没有成功。
最佳答案
使用设计的可恢复代码作为基础,我做到了
模型:
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
应用 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)
关于ruby-on-rails - 如何创建一个让用户自动登录到设备/rails 的链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562638/