5

Tôi đã theo dõi Ryan Boland's excellent Rails multitenancy tutorial, nhưng đã chạy vào một snag với devise_invitable. Tôi đang sử dụng ...Rails 4 devise_invitable token token không hợp lệ

Rails 4.1.5 
devise 3.3.0 
devise_invitable 1.3.6 
Postgresql 

tôi có thể tạo một tài khoản mới và chủ sở hữu sử dụng/tài khoản trên một tên miền phụ được lựa chọn (mysubdomain.lvh.me:3000), từ đó tôi có thể gửi một lời mời sử dụng tốt. Tôi mở liên kết lời mời trong phiên Chrome ẩn danh để đảm bảo tôi chưa đăng nhập hoặc có bất kỳ phiên hiện tại nào. Khi nhấp vào liên kết lời mời, tôi được chuyển hướng đến trang đăng nhập (mysubdomain.lvh.me:3000/users/sign_in) và xem thông báo flash: "Mã thông báo mời đã cung cấp không hợp lệ!"

Tôi đang sử dụng một cái nhìn bưu phẩm rất đơn giản (app/views/đưa ra/bưu phẩm/invitation_instructions.html.erb) ...

<%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @token) %> 

Như bạn thấy, tôi đảm bảo việc sử dụng @token, như được mô tả here.

Khi tạo lời mời, tôi đã khẳng định được dấu hiệu mời được lưu vào cơ sở dữ liệu (trong trường hợp này cho [email protected] - d1801fd8df78bd8cd125d5d8091fdc6a72c8f8faf4136cb282d497ec612195e9). Tôi đã xác nhận điều này khớp với mã thông báo tra cứu lời mời khi yêu cầu chấp nhận (xem dấu vết bên dưới). Tuy nhiên, nó chuyển hướng đến trang đăng nhập của người dùng thay vì hoàn tất đăng ký và cũng hiển thị trong nhật ký theo dõi "Chuỗi bộ lọc bị tạm dừng khi: resource_from_invitation_token hiển thị hoặc chuyển hướng". Người dùng vẫn chưa được xác nhận cuối cùng sau giao dịch này.

Bất kỳ ý tưởng nào về những gì có thể xảy ra với tôi ở đây? Tôi bao gồm các bản ghi, điều khiển ứng dụng của tôi, và devise cấu hình của tôi dưới đây ...

Đây là dấu vết đăng nhập để tạo ra lời mời:

Started POST "https://stackoverflow.com/users/invitation" for 127.0.0.1 at 2014-09-07 01:28:33 +0800 
Processing by Devise::InvitationsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"BiIQ95wwdQz3CJ0+OoLOE9xHHvxhloHsRHrxsqf1D2Q=", "user"=>{"email"=>"[email protected]"}, "commit"=>"Invite User"} 
    User Load (4.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 
    Account Load (0.4ms) SELECT "public"."accounts".* FROM "public"."accounts" WHERE "public"."accounts"."subdomain" = 'mysubdomain' LIMIT 1 
    User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."email" = '[email protected]' ORDER BY "users"."id" ASC LIMIT 1 
    User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."invitation_token" = 'd1801fd8df78bd8cd125d5d8091fdc6a72c8f8faf4136cb282d497ec612195e9' ORDER BY "users"."id" ASC LIMIT 1 
    (0.1ms) BEGIN 
    SQL (0.5ms) INSERT INTO "users" ("created_at", "email", "invitation_created_at", "invitation_sent_at", "invitation_token", "invited_by_id", "invited_by_type", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id" [["created_at", "2014-09-06 17:28:34.296123"], ["email", "[email protected]"], ["invitation_created_at", "2014-09-06 17:28:34.294987"], ["invitation_sent_at", "2014-09-06 17:28:34.294987"], ["invitation_token", "d1801fd8df78bd8cd125d5d8091fdc6a72c8f8faf4136cb282d497ec612195e9"], ["invited_by_id", 1], ["invited_by_type", "User"], ["updated_at", "2014-09-06 17:28:34.296123"]] 
    (2.2ms) COMMIT 
    Rendered devise/mailer/invitation_instructions.html.erb (1.3ms) 

Devise::Mailer#invitation_instructions: processed outbound mail in 23.5ms 

Sent mail to [email protected] (26.0ms) 
Date: Sun, 07 Sep 2014 01:28:34 +0800 
From: [email protected] 
Reply-To: [email protected] 
To: [email protected] 
Message-ID: <...> 
Subject: Invitation instructions 
Mime-Version: 1.0 
Content-Type: text/html; 
charset=UTF-8 
Content-Transfer-Encoding: 7bit 

<a href="http://mysubdomain.lvh.me:3000/users/invitation/accept?invitation_token=3GXDmi7NntDRdhvo57q5">Accept invitation</a> 
Redirected to http://mysubdomain.lvh.me:3000/users 
Completed 302 Found in 888ms (ActiveRecord: 10.0ms) 

Đây là dấu vết khi đi theo các liên kết lời mời ...

Started GET "https://stackoverflow.com/users/invitation/accept?invitation_token=3GXDmi7NntDRdhvo57q5" for 127.0.0.1 at 2014-09-07 01:28:38 +0800 
Processing by Devise::InvitationsController#edit as HTML 
    Parameters: {"invitation_token"=>"3GXDmi7NntDRdhvo57q5"} 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."invitation_token" = 'd1801fd8df78bd8cd125d5d8091fdc6a72c8f8faf4136cb282d497ec612195e9' ORDER BY "users"."id" ASC LIMIT 1 
Redirected to http://mysubdomain.lvh.me:3000/users/sign_in 
Filter chain halted as :resource_from_invitation_token rendered or redirected 
Completed 302 Found in 5ms (ActiveRecord: 0.6ms) 


Started GET "https://stackoverflow.com/users/sign_in" for 127.0.0.1 at 2014-09-07 01:28:38 +0800 
Processing by Devise::SessionsController#new as HTML 
    Account Load (0.4ms) SELECT "public"."accounts".* FROM "public"."accounts" WHERE "public"."accounts"."subdomain" = 'mysubdomain' LIMIT 1 
    Rendered devise/shared/_links.erb (0.7ms) 
    Rendered devise/sessions/new.html.erb within layouts/application (4.4ms) 
Completed 200 OK in 21ms (Views: 16.6ms | ActiveRecord: 1.3ms) 

đây là application_controller tôi cho biện pháp tốt ...

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 
    before_filter :load_schema, :authenticate_user!, :set_mailer_host 
    before_filter :configure_permitted_parameters, if: :devise_controller? 


    protected 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :last_name, :company, :email, :password, :password_confirmation, :remember_me, :image, :image_cache)} 
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:first_name, :last_name, :company, :email, :password_confirmation, :current_password, :image, :image_cache)} 
    end 

private 
    def load_schema 
    Apartment::Database.switch('public') 
    return unless request.subdomain.present? 

    if current_account 
     Apartment::Database.switch(current_account.subdomain) 
    else 
     redirect_to root_url(subdomain: false) 
    end 
    end 

    def current_account 
    @current_account ||= Account.find_by(subdomain: request.subdomain) 
    end 
    helper_method :current_account 

    def set_mailer_host 
    subdomain = current_account ? "#{current_account.subdomain}." : "" 
    ActionMailer::Base.default_url_options[:host] = "#{subdomain}lvh.me:3000" 
    end 

    def after_sign_out_path_for(resource_or_scope) 
    new_user_session_path 
    end 

    def after_invite_path_for(resource) 
    users_path 
    end 

end 

Đây là khởi tạo lập mưu của tôi (config/initializers/devise.rb), tôi đã thêm dòng "config.allow_insecure_token_lookup = true" để xem nếu điều này sẽ giúp, nhưng không có kết quả ...

Devise.setup do |config| 

    config.mailer_sender = '[email protected]' 

    require 'devise/orm/active_record' 

    config.case_insensitive_keys = [ :email ] 

    config.strip_whitespace_keys = [ :email ] 

    config.skip_session_storage = [:http_auth] 

    config.stretches = Rails.env.test? ? 1 : 10 

    config.reconfirmable = true 

    config.expire_all_remember_me_on_sign_out = true 

    config.password_length = 8..128 

    config.sign_out_via = :delete 

    config.allow_insecure_token_lookup = true 
end 

Trả lời

1

tôi d thích bình luận nhưng tôi chỉ có 36 điểm và đang không được phép vì vậy đây là một câu trả lời không đầy đủ:

đây là mã từ InvitationsController devise_invitable được chuyển hướng yêu cầu

def resource_from_invitation_token 
    unless params[:invitation_token] && self.resource = resource_class.find_by_invitation_token(params[:invitation_token], true) 
    set_flash_message(:alert, :invitation_token_invalid) 
    redirect_to after_sign_out_path_for(resource_name) 
    end 
end 

trong đường ray của bạn console thử chạy của bạn:

token = '3GXDmi7NntDRdhvo57q5' #the token sent in the invitation email 
User.find_by_invitation_token(token, true) 

và xem điều đó có trả về Người dùng của bạn hay không. Nó có lẽ sẽ không nhưng có lẽ điều này sẽ đưa bạn đến gần hơn với một câu trả lời. Tôi cũng mong là như vậy.

Các vấn đề liên quan