4

URL の確認トークン パラメータに基づいて、ユーザーを自動的にログインできるようにしたい状況があります。私のルートでは、サーバーに AJAX リクエストを送信してトークンを検証し、ログインに使用されるのと同じシリアル化された Oauth2 JSON を送り返しています。

このトークンを使用してユーザーをログインさせることはできますか?

まず、ユーザーは次のような URL にアクセスします。

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

次に、ルートは AJAX リクエストをサーバーに送信し、サーバーは Oauth2 トークンで応答します。

オーセンティケーターを使用して復元しようとしている現在の実装を次に示します。コンソールに「ログインする必要があります」と表示されているにもかかわらず、機能していません。これは、セッションを復元する方法がわからないためだと思われます。セッションのドキュメントを見ると、手動で認証するパブリック メソッドが表示されますが、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);
    });
  }
});
4

1 に答える 1

0

メソッドだけをオーバーライドして、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);
  }
});
于 2014-08-29T19:27:07.800 に答える