Я пишу приложение с аутентификацией JWT, ввод осуществляется через request.query_parameters, то есть через ссылку, подобную example.com?Authorization=token
, ввод работает, но когда я вызываю какое-либо действие, он перенаправляет меня в индекс без сохранения токен и выбивает 401. Мой контроллер приложений :
protected
def authenticate_request!
if !payload || !JsonWebToken.valid_payload(payload.first)
return invalid_authentication
end
load_current_user!
invalid_authentication unless @current_user
end
def invalid_authentication
render json: {error: 'Invalid Request'}, status: :unauthorized
end
private
def payload
auth_header = request.query_parameters['Authorization']
token = auth_header.split(' ').last
JsonWebToken.decode(token)
rescue
nil
end
def load_current_user!
@current_user = User.find_by(id: payload[0]['user_id'])
end
main_controller
class MainController < ApplicationController
before_action :authenticate_request!
# GET /
def index
end
Вот журнал для примера того, что я делаю:
Started GET "/?Authorization=eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo1LCJleHAiOjE1NTMyMzQxMzgsImlzcyI6Imlzc3Vlcl9uYW1lIiwiYXVkIjoiY2xpZW50In0.q9-S1lB_ueu53XREdeXAoO_VKeEE6nBV1-d1zkO5o3M" for ::1 at 2019-03-16 21:50:09 +0600 Processing by MainController#index as HTML Parameters: {"Authorization"=>"eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo1LCJleHAiOjE1NTMyMzQxMzgsImlzcyI6Imlzc3Vlcl9uYW1lIiwiYXVkIjoiY2xpZW50In0.q9-S1lB_ueu53XREdeXAoO_VKeEE6nBV1-d1zkO5o3M"} User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]] CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]] User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]] Rendering main/index.html.erb within layouts/application Rendered main/index.html.erb within layouts/application (0.3ms) Rendered shared/_header.html.erb (1.3ms) Rendered shared/modals/_create_room_modal.html.erb (4.7ms) Completed 200 OK in 110ms (Views: 104.3ms | ActiveRecord: 0.6ms)
Started GET "/u/gl-fcsveclewrto/recordings" for ::1 at 2019-03-16 21:50:13 +0600 Processing by UsersController#recordings as HTML Parameters: {"user_uid"=>"gl-fcsveclewrto"} User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]] CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]] Redirected to http://localhost:3000/ Completed 302 Found in 4ms (ActiveRecord:
0.5ms)
Started GET "/" for ::1 at 2019-03-16 21:50:13 +0600 Processing by MainController#index as HTML User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]] CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]] Filter chain halted as :authenticate_request! rendered or redirected Completed 401 Unauthorized in 4ms (Views: 0.4ms | ActiveRecord: 0.5ms)
Как я понимаю, он не может сохранить состояние и передать его дальше? Или я должен как-то обработать токен спереди и сохранить, скажите, пожалуйста, что я делаю не так?