devise_token_auth всегда возвращает 401 неавторизованным - PullRequest
0 голосов
/ 02 июля 2018

Я работаю над приложением Angular с Rails API. Я использую Devise Token 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.
  • Я указал следующие заголовки в конфигурации стойки-cors: ['access-token', 'expiry', 'token-type', 'uid', 'client'].

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

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

{
    "data": {
        "id": 1,
        "email": "me@example.com",
        "provider": "email",
        "uid": "me@example.com",
        "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, и поэтому заголовки никогда не добавляются.

1 Ответ

0 голосов
/ 26 июля 2018

Я не знаю о 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)).

...