Я работаю над приложением Angular с API Rails. Я использую 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.
- Я выставил следующие заголовки в конфиге Rack-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
}
}
Код Angular:
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
и, таким образом, заголовки никогда не добавляются.
angular-token
. - person Niek   schedule 02.07.2018