Ped*_*des 5 email ruby-on-rails devise ruby-on-rails-4
我试图让注册用户在我的网站上执行一些操作,所以我想通过电子邮件向他们发送一个直接指向此操作的链接。
问题是我希望他们在单击此链接时自动登录。
我可以做一些显而易见的事情,例如创建一个独特的令牌并将其通过 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
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)
| 归档时间: |
|
| 查看次数: |
1748 次 |
| 最近记录: |