Я работаю над приложением 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.['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, и поэтому заголовки никогда не добавляются.
Я добавил примеры. Обратите внимание, что знак сам по себе работает нормально, это запросы к ресурсам, в которых заключается проблема.
мне нужно увидеть заголовок вашего ответа. Заголовок вашего ответа должен содержать следующие параметры: токен доступа - uid - client - срок действия. Эти параметры должны быть сохранены и после этого добавлены в каждый HTTP-запрос, который вы делаете. ты уже сделал это?
Да, заголовки ответа включают все эти заголовки. angular-token предназначен для хранения токена.
Нет, даже с angular-token вам нужно установить заголовок вашего запроса, если вы его не установили, я думаю, что это ошибка.





Я не знаю насчет 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)).
вы можете показать нам пример использования почтальона? пример входа в систему, чтобы увидеть, какой сервер rails вернет. И ваш угловой код, когда вы вызываете свой API.