Devise_token_auth всегда возвращает 401 Unauthorized

Я работаю над приложением Angular с Rails API. Я использую Разработать токен Auth и 6.x ветка angular-token. Я могу без проблем работать с пользователями CRUD и могу войти в систему, но когда я пытаюсь получить доступ к ограниченному ресурсу (один ограничен с помощью помощника before_action :authenticate_user!), я получаю сообщение об ошибке независимо от того, вошел я в систему или нет.

Соответствующий контроллер:

class QuestionsController < ApplicationController
    before_action :authenticate_user!

    # GET /questions.json
    def index
      @questions = Question.all

      # This code is never reached due to the :authenticate_user! helper, 
      # but when I comment it out, I get the following:
      puts user_signed_in?  # => false
      puts current_user     # => nil

      render json: @questions
    end

Несколько вещей:

  • Я определенно вошел в систему согласно angular-token - TokenService.UserSignedIn() возвращает true во время 401 Unauthorized response.
  • Я включил CORS.
  • Я выставил следующие заголовки в конфигурации стойки-корса: ['access-token', 'expiry', 'token-type', 'uid', 'client'].

Любая помощь будет принята с благодарностью.

Пример ответа от входа:

{
    "data": {
        "id": 1,
        "email": "[email protected]",
        "provider": "email",
        "uid": "[email protected]",
        "allow_password_change": false,
        "name": null,
        "nickname": null,
        "image": null
    }
}

Угловой код:

this.authService.loginUser({
  login: '',
  password: ''
})
.subscribe(resp => {
    if (resp.status === 200) {
      this.router.navigate(['/']);
    }
  },
  err => {
    // cut for brevity
});

Редактировать:

Я понял, что проблема в том, что angular-token не устанавливает заголовки аутентификации из-за того, что я считаю ошибкой в ​​следующем коде:

// Add the headers if the request is going to the configured server
if (this.tokenService.currentAuthData && req.url.match(this.tokenService.apiPath)) {
  (<any>Object).assign(baseHeaders, {
    'access-token': this.tokenService.currentAuthData.accessToken,
    'client':       this.tokenService.currentAuthData.client,
    'expiry':       this.tokenService.currentAuthData.expiry,
    'token-type':   this.tokenService.currentAuthData.tokenType,
    'uid':          this.tokenService.currentAuthData.uid
  });
}

Поскольку у меня не определен apiPath, req.url.match(this.tokenService.apiPath)) оценивается как false, и поэтому заголовки никогда не добавляются.

вы можете показать нам пример использования почтальона? пример входа в систему, чтобы увидеть, какой сервер rails вернет. И ваш угловой код, когда вы вызываете свой API.

El Fadel Anas 02.07.2018 13:22

Я добавил примеры. Обратите внимание, что знак сам по себе работает нормально, это запросы к ресурсам, в которых заключается проблема.

Niek 02.07.2018 13:39

мне нужно увидеть заголовок вашего ответа. Заголовок вашего ответа должен содержать следующие параметры: токен доступа - uid - client - срок действия. Эти параметры должны быть сохранены и после этого добавлены в каждый HTTP-запрос, который вы делаете. ты уже сделал это?

El Fadel Anas 02.07.2018 13:45

Да, заголовки ответа включают все эти заголовки. angular-token предназначен для хранения токена.

Niek 02.07.2018 17:14

Нет, даже с angular-token вам нужно установить заголовок вашего запроса, если вы его не установили, я думаю, что это ошибка.

El Fadel Anas 02.07.2018 17:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
1 348
1

Ответы 1

Я не знаю насчет angular-token, но у меня была такая же проблема с моим приложением на основе React / Redux - оказалось, что это действительно была просто проблема с отсутствующими заголовками или неправильной настройкой.

По какой-то причине кажется, что контроллеры на основе DeviseTokenAuth:: могут работать только путем установки client и access-token, но для всех других ресурсов, защищенных DeviseTokenAuth::Concerns::SetUserByToken, вы должны установить заголовки all точно так, как ожидалось и задокументировано в devise_token_auth.

  • Проверьте значения и форматы заголовков.
  • Убедитесь, что заголовки в точности совпадают с заголовками, возвращенными последним запросом (запрос аутентификации в вашем случае).
  • Также проверьте свое отображение

В config/initializers/devise_token_auth.rb:

config.headers_names = {:'access-token' => 'access-token',
                     :'client' => 'client',
                     :'expiry' => 'expiry',
                     :'uid' => 'id',
                     :'token-type' => 'token-type' }

(он определяет имя ожидаемых заголовков http (а не атрибуты models / activerecords)).

Другие вопросы по теме