Восстановить сеанс без электронной почты и пароля с помощью токена Oauth2

У меня есть ситуация, когда я хочу иметь возможность автоматически входить в систему пользователя на основе параметра токена подтверждения в URL-адресе. На моем маршруте я делаю AJAX-запрос на сервер для проверки токена и отправляю обратно тот же сериализованный Oauth2 JSON, который используется для входа в систему.

Можно ли войти в систему с этим токеном?

Сначала пользователь переходит по URL-адресу, например:

http://example.com/users/confirmation?confirmation_token=eisz6LMzmck55xHuqopF

Затем мой маршрут отправляет запрос AJAX на сервер, который отвечает токеном Oauth2.

Вот моя текущая реализация, пытающаяся использовать аутентификатор для его восстановления. Несмотря на то, что в консоли отображается сообщение «Я должен войти в систему», это не работает. Я подозреваю, что это потому, что он не знает, как восстановить сеанс. Глядя на документацию по сеансу n, я вижу общедоступный метод для ручной аутентификации, но не для восстановления из токена oauth.

import Ember from 'ember';
import ajax from 'ic-ajax';

export default Ember.Route.extend({
  model: function(params) {
    var path = MyApp.API_NAMESPACE + '/confirmation?confirmation_token=' + params.confirmation_token;
    var authenticator = this.container.lookup('simple-auth-authenticator:oauth2-password-grant');

    return ajax(path).then(function(response) {
      return authenticator.restore(response).then(function() {
        console.log('I should be logged in');
      });
    }).catch(function(request) {
      console.log(request);
    });
  }
});

person Peter Brown    schedule 14.08.2014    source источник


Ответы (1)


Я решил эту проблему, создав собственный аутентификатор, который по существу наследуется от аутентификатора oauth2, переопределяя только метод authenticate.

Сначала я создал свой аутентификатор в app/lib/confirmation-authenticator.js:

import OAuth2Authenticator from 'simple-auth-oauth2/authenticators/oauth2';
import ajax from 'ic-ajax';

export default OAuth2Authenticator.extend({
  authenticate: function(token) {
    var path = MyApp.API_NAMESPACE + '/confirmation?confirmation_token=' + token;

    return new Ember.RSVP.Promise(function(resolve, reject) {
      ajax(path).then(function(response) {
        resolve(response);
      }).catch(function(request) {
        reject(request.textStatus);
      });
    });
  }
});

Затем зарегистрируйте аутентификатор в моем инициализаторе по адресу app/initializers/authentication:

import ConfirmationAuthenticator from 'my-app/lib/confirmation-authenticator';

export default {
  name: 'authentication',
  before: 'simple-auth',

  initialize: function(container) {
    container.register('simple-auth-authenticator:confirmation', ConfirmationAuthenticator);

    window.ENV = window.ENV || {};

    window.ENV['simple-auth'] = {
      authorizer: 'simple-auth-authorizer:oauth2-bearer',
    };

    window.ENV['simple-auth-oauth2'] = {
      serverTokenEndpoint: MyApp.API_NAMESPACE + '/oauth/token'
    };
  }
};

И, наконец, мой маршрут на app/routes/users/confirmation.js:

import Ember from 'ember';

export default Ember.Route.extend({
  model: function(params) {
    var token = params.confirmation_token;

    return this.get('session').authenticate('simple-auth-authenticator:confirmation', token);
  }
});
person Peter Brown    schedule 29.08.2014