使用令牌和 SimpleTokenAuthentication 登录用户的测试失败,因为 SimpleTokenAuthentication 未登录用户
Tests for signing in User using token and SimpleTokenAuthentication failing because SimpleTokenAuthentication not signing in user
Rails 5.2
gem: SimpleTokenAuthentication
我有以下控制器:
class RegistrationsController < ApplicationController
acts_as_token_authentication_handler_for User, only: [:start]
def start
binding.pry
if user_signed_in?
redirect_to edit_user_path(current_user)
else
redirect_to new_user_session_path
end
end
end
我有一个 link 页面,其中 user_email 和 user_token 参数填充了适当的数据。
当我单击 link 时,如果令牌有效且电子邮件属于数据库中的某个用户,acts_as_token_authentication_handler_for 用户会登录该用户。
但是,当我尝试 运行 一个简单的 rspec 测试时,我收到一个内部服务器错误。
这是 Rspec 测试:
RSpec.describe 'Registering New Staff' do
let(:new_user) { create(:user) }
describe 'accessing the registration start page' do
it 'redirects to the edit user path when user signed in' do
params = { user_email: new_user.email, user_token: new_user.authentication_token }
get start_registration_path(params)
expect(response).to redirect_to(edit_user_path(new_user))
end
end
这是我得到的错误:
Failure/Error: expect(response).to redirect_to(edit_user_path(new_user))
Expected response to be a <3XX: redirect>, but was a <500: Internal Server Error>
acts_as_token_authentication_handler_for 的登录过程似乎出了问题,但我无法弄清楚。
感谢任何帮助。
最后我没有使用 SimpleTokenAuthentication 而是使用了我自己的代码如下:
class RegistrationsController < ApplicationController
before_action :authenticate_user_from_token!, only: [:start]
def preview
end
def start
authorize :registration
if user_signed_in?
redirect_to edit_user_path(current_user)
else
raise Pundit::NotAuthorizedError
end
end
def calendar
authorize :registration
end
def confirmation
authorize :registration
current_user.register
end
private
def authenticate_user_from_token!
sign_out current_user if user_signed_in?
if user && Devise.secure_compare(user.authentication_token, params[:user_token])
sign_in user
@current_user = user
renew_authentication_token
end
end
def user
@user ||= User.find_by(email: params[:user_email])
end
def renew_authentication_token
current_user.renew_authentication_token!
end
end
Rails 5.2 gem: SimpleTokenAuthentication
我有以下控制器:
class RegistrationsController < ApplicationController
acts_as_token_authentication_handler_for User, only: [:start]
def start
binding.pry
if user_signed_in?
redirect_to edit_user_path(current_user)
else
redirect_to new_user_session_path
end
end
end
我有一个 link 页面,其中 user_email 和 user_token 参数填充了适当的数据。
当我单击 link 时,如果令牌有效且电子邮件属于数据库中的某个用户,acts_as_token_authentication_handler_for 用户会登录该用户。
但是,当我尝试 运行 一个简单的 rspec 测试时,我收到一个内部服务器错误。
这是 Rspec 测试:
RSpec.describe 'Registering New Staff' do
let(:new_user) { create(:user) }
describe 'accessing the registration start page' do
it 'redirects to the edit user path when user signed in' do
params = { user_email: new_user.email, user_token: new_user.authentication_token }
get start_registration_path(params)
expect(response).to redirect_to(edit_user_path(new_user))
end
end
这是我得到的错误:
Failure/Error: expect(response).to redirect_to(edit_user_path(new_user))
Expected response to be a <3XX: redirect>, but was a <500: Internal Server Error>
acts_as_token_authentication_handler_for 的登录过程似乎出了问题,但我无法弄清楚。
感谢任何帮助。
最后我没有使用 SimpleTokenAuthentication 而是使用了我自己的代码如下:
class RegistrationsController < ApplicationController
before_action :authenticate_user_from_token!, only: [:start]
def preview
end
def start
authorize :registration
if user_signed_in?
redirect_to edit_user_path(current_user)
else
raise Pundit::NotAuthorizedError
end
end
def calendar
authorize :registration
end
def confirmation
authorize :registration
current_user.register
end
private
def authenticate_user_from_token!
sign_out current_user if user_signed_in?
if user && Devise.secure_compare(user.authentication_token, params[:user_token])
sign_in user
@current_user = user
renew_authentication_token
end
end
def user
@user ||= User.find_by(email: params[:user_email])
end
def renew_authentication_token
current_user.renew_authentication_token!
end
end