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