我试图让注册用户在我的网站上采取一些行动,所以我想通过电子邮件直接发送一个链接到这个动作。
问题是我希望在点击该链接时自动登录。
我可以做一些明显的事情,比如创建一个独特的令牌并通过url mysite.com/my_funky_action?login_bypass_token=af123fa127ba32传递它,但这在我看来是一个问题"在#34之前解决了很多次;
那么,使用rails / devise有一个简单的方法可以做到这一点吗?我没有成功地搜索设计文档。
答案 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
鉴于此,任何人都可以通过发送如上所述的网址来替换任何注册用户,替换他们想要的任何电子邮件。
寻找令牌,确保它在使用时或在您可以逃脱的最短时间后到期。