0

Rails アプリで Authlogic を使用していますが、腐りやすいトークンに基づいてユーザーが見つからないことがある理由がわかりません。通常は機能しますが、機能しない場合もあります。このコードを使用して、ユーザーがログインできるようになる前に確認できるようにしました。ユーザーの DB。腐りやすいトークンはユーザーのものと一致します。

プロセスは次のとおりです。

users_controller #create で

@user.deliver_verification_instructions!(@subdomain)

ユーザーモデルで:

def deliver_verification_instructions!(subdomain)
  reset_perishable_token!
  Notifier.verification_instructions(self, subdomain).deliver!
end 

私のメーラー(Notifier.rb)で

# email on new user registration to verify user
def verification_instructions(user,subdomain)
  @user = user
  @subdomain = subdomain
  @url  = "http://#{@subdomain.name}.foobar.com/user_verifications/#{@user.perishable_token}"
  sent_on       Time.now
  mail(:to => "#{user.first_name} <#{user.email}>",
    :subject => "Email Verification",
    :from => 'Foo <info@foobar.com>') do |format|
    format.text
    format.html
  end
end

電子メール ビューで:

Please click the following link to verify your email address:                                           
<%= @url %>

User_verifications コントローラーで

class UserVerificationsController < ApplicationController
  before_filter :load_user_using_perishable_token

def show
  @subdomain = Subdomain.find_by_user_name(current_subdomain)

  if @user
    @user.verify!
    flash[:notice] = "Thank you for verifying your account. You may now login."
  end
  redirect_to home_path
end

private
  def load_user_using_perishable_token
    @user = User.find_using_perishable_token(params[:id])
    flash[:notice] = "Unable to find your account." unless @user
  end
end

このコードは、「アカウントが見つかりません」を返すことがあります。つまり、電子メールの URL のトークンがデータベースに表示されているものと一致しているにもかかわらず、腐りやすいトークンが見つからないということです。

Heroku のログを見ると、次のように表示されます。

2013-01-11 00:10:01+00:00 app web.1     - - Started GET "/user_verifications/lTpNRnjDw4WbyAMUyw6" for 10.253.207.217/ip-10-253-207-217.eu-west-1.compute.internal at 2013-01-11 00:10:01 +0000
2013-01-11 00:10:02+00:00 heroku router - - at=info method=GET path=/user_verifications/lTpNRnjDw4WbyAMUyw6 host=mvfd.foobar.com fwd=10.253.207.217/ip-10-253-207-217.eu-west-1.compute.internal dyno=web.1 queue=0 wait=0ms connect=10ms service=1325ms status=302 bytes=96
2013-01-11 00:10:02+00:00 app web.1     - - cache: [GET /user_verifications/lTpNRnjDw4WbyAMUyw6] miss
2013-01-11 00:10:02+00:00 app web.1     - -   Processing by UserVerificationsController#show as HTML
2013-01-11 00:10:02+00:00 app web.1     - -   Parameters: {"id"=>"lTpNRnjDw4WbyAMUyw6"}
2013-01-11 00:10:02+00:00 app web.1     - - Redirected to http://mvfd.foobar.com/home
2013-01-11 00:10:02+00:00 app web.1     - - Completed 302 Found in 1008ms

ご協力いただきありがとうございます。

4

1 に答える 1

2

Authlogic はデフォルトで 10 分後に腐敗しやすいトークンを期限切れにするため (セキュリティのため)、一部のユーザーは期限切れ後にパスワード リセット リンクをたどっている可能性があります。

User モデルでこの設定を変更できます。

class User < ActiveRecord::Base
  acts_as_authentic do |config|
    config.perishable_token_valid_for = 1.hour
  end
end

https://github.com/binarylogic/authlogic/blob/master/lib/authlogic/acts_as_authentic/perishable_token.rb#L15-L25

または、別の有効期限の値をコントローラーの find_using_perishable_token メソッドに渡します。

@user = User.find_using_perishable_token(params[:id], 1.hour)

https://github.com/binarylogic/authlogic/blob/master/lib/authlogic/acts_as_authentic/perishable_token.rb#L55-L63

アプリケーションのセキュリティ要件に応じて、有効期限の値を増やすリスクを必ず考慮してください。

于 2013-04-03T16:08:59.997 に答える