Ember-simple-auth: как добавить заголовок авторизации к запросам, инициированным браузером

Я использую oAuth2.

DataAdapterMixin автоматически добавляет заголовок Authorization ко всем запросам Ember Data. Метод авторизации службы сеанса можно использовать для добавления его в вызовы Ajax, но как я могу обеспечить добавление заголовка в запросы GET, сделанные из браузера. Я попытался создать собственный авторизатор, как описано в документации, но метод авторизации не вызывается.

Мое приложение хранит сканы счетов и выписок (обычно в формате pdf), которые могут быть просмотрены только авторизованным пользователем. В зависимости от действий пользователя я изменяю атрибут данных тега объекта.

Этот

<object data={{attachViewURL}} width="800px" height="1200px">

отображается как-то так:

<object data="/scans/attachments/11"  width="800px" height="1200px">

Это отлично работает, кроме авторизации.

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


person Tim Romero    schedule 03.12.2015    source источник
comment
Просто проверяя, правильно ли я понимаю (поскольку ваш пример кода на самом деле не соответствует вашему вопросу), вы действительно хотите добавить Authorization: Bearer XXXXXXXXXX в свой заголовок http (согласно стандартам oAuth)?   -  person Stephen Wright    schedule 03.12.2015
comment
Да, именно это я и имел в виду. Чтобы этот заголовок добавлялся ко всем запросам.   -  person Tim Romero    schedule 04.12.2015


Ответы (2)


Вместо того, чтобы отвечать на мой комментарий, я просто приведу сюда свое решение:

import Ember from 'ember';
import SimpleAuth from 'simple-auth/authorizers/base';

export default SimpleAuth.extend({
    authorize: function(jqXHR) {
        var token = this.get('session.secure.token');
        if (this.get('session.isAuthenticated') && !Ember.isEmpty(token)) {
          jqXHR.setRequestHeader('Authorization: ', 'Bearer ', token);
        }
    },
});

Вы, вероятно, захотите сделать немного больше проверок и т. д., но это почти все, что вам нужно сделать, чтобы фактически установить заголовок; просто переопределяя функцию авторизации, встроенную в ember-simple-auth, чтобы установить заголовок после прохождения авторизации (как определено как логическим значением session.isAuthenticated, так и переданным token

ИЗМЕНИТЬ:

Я забыл, что вам также нужно указать, что вы используете свой локальный авторизатор в своей конфигурации простой аутентификации (это на какое-то время сбило меня с толку, потому что я предположил, что ember-simple-auth будет использовать переопределенный локальный авторизатор по умолчанию):

ENV['simple-auth'] = {
  authenticationRoute: 'login',
  authorizer: 'authorizer:local',
  session: 'session:user-session',
  routeAfterAuthentication: 'dashboard'
}

Я попытаюсь найти, откуда я это взял (потому что документация ember-simple-auth особенно не очень хороша для описания механизмов авторизации с самопроверкой...)

EDIT 2: Как указал marcoow (и он должен знать, он написал ember-simple-auth!), это поведение до версии 1.0. Авторизатор теперь является частью службы сеанса, которую необходимо внедрить в приложение. См. обновление ember-simple-labs до версии 1.0

person Stephen Wright    schedule 03.12.2015
comment
Имейте в виду, что это относится только к Ember Simple Auth версии до 1.0. - person marcoow; 04.12.2015
comment
Спасибо @stephen, что нашли время ответить, но, похоже, это не работает. Кажется, что метод авторизации просто не вызывается, когда GET инициируется из браузера. - person Tim Romero; 04.12.2015

Единственный подход, который мне удалось заставить работать, - это включить токен доступа в сгенерированный URL-адрес, а затем вручную выполнить аутентификацию на серверной части.

URL-адрес в конечном итоге выглядит примерно так:

<object  data="/scans/attachments/11?token=a0a59197-afab-438a-b6cf-11237e51a2d5"  width="800px" height="1200px">

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

person Tim Romero    schedule 05.12.2015