Как заменить метод авторизации в ember-simple-auth - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь реорганизовать свои приемочные тесты Ember, чтобы не использовать метод устаревший authorize, так как он выдает предупреждение:

The `authorize` method should be overridden in your application adapter

Я проверил документы и множество других источников, но они на самом деле не объясняют как перенести мой код. Вот то, что у меня есть на данный момент:

// projectname/app/pods/login/controller.js (excerpt)
export default Controller.extend({
    session: service(),
    sessionToken: null,

    onSuccess: function(res) {
    res = res.response;
        this.set('sessionToken', res.session);
        if (res.state === "authenticated") {
            document.cookie = "token="+res.session+";path=/;";
            var authOptions = {
                success: true,
                data : {
                    session : res.session,
                }
            };
            this.get('session').authenticate("authenticator:company", authOptions);
        }
    }
});

И от этой части я должен избавиться:

// project/app/adapters/application.js (excerpt)
export default DS.RESTAdapter.extend(DataAdapterMixin, {
    authorize(xhr) { // This is deprecated! I should remove it
        let sessionToken = this.get('session.data.authenticated.session');
        if (sessionToken && !isEmpty(sessionToken)) {
            xhr.setRequestHeader('Authorization', "Token " + sessionToken);
        }
    },
});

И вот мой тест:

import { test, module } from 'qunit';
import { visit, currentURL, find, click, fillIn } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit';
import { authenticateSession} from 'ember-simple-auth/test-support';

module('moduleName', function(hooks) {
    setupApplicationTest(hooks);

    test('moduleName', async function(assert) {
        // await authenticateSession(this.application); // Never works
        // await authenticateSession(); // Never works
        await authenticateSession({
            authenticator: "authenticator:company"
        }); // Works slightly more?
        await visit('/my/other/page');
        await assert.equal(currentURL(), '/my/other/page');
    });
});

УДАЛЕНИЕ метода authorize и попытка любого из закомментированных методов приводит к:

Error: Assertion Failed: The `authorize` method should be overridden in your application adapter. It should accept a single argument, the request object.

Если я использую блок authenticator в качестве аргумента, то независимо отПри наличии метода authorize я просто получаю:

    actual: >
        /login
    expected: >
        /my/other/page

Что, как я полагаю, связано с тем, что он не вошел в систему.

Оставив там метод authorize и попробовавКомментируемые методы дают:

Error: Browser timeout exceeded: 10s

Ответы [ 2 ]

0 голосов
/ 15 ноября 2019

Когда я задал этот вопрос, я отправил проблему на странице github для Ember Simple Auth , и сообщество очень быстро подготовило руководство о том, какобновить до v3 , и в настоящее время также работает над исправлением для проблемы, с которой я сталкиваюсь.

Я ожидаю, что в скором времени будет исправление для этой проблемы, поэтому дляТеперь ответ на этот вопрос - дождаться следующего выпуска Ember Simple Auth (2.2.0) или использовать предыдущую версию (2.0.0). Это устаревание присутствует только в 2.1.0

0 голосов
/ 01 ноября 2019

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

Поскольку вам нужны данные сеансав вашем заголовке Authorization возможное решение для вашего варианта использования может выглядеть следующим образом:

export default DS.RESTAdapter.extend(DataAdapterMixin, {
    headers: computed('session.data.authenticated.session', function() {
      const headers = {};
      let sessionToken = this.get('session.data.authenticated.session');
      if (sessionToken && !isEmpty(sessionToken)) {
        headers['Authorization'] = "Token " + sessionToken;
      }

      return headers;
    })
});

Это должно позволить вам динамически устанавливать заголовок Authorization без использования метода authorize.

...