首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >成员简单8月-自定义授权器中断身份验证

成员简单8月-自定义授权器中断身份验证
EN

Stack Overflow用户
提问于 2014-11-17 12:09:41
回答 1查看 1.6K关注 0票数 1

我正在使用成员-cli-简单-简单的加注与托里作为我的认证流程。

到目前为止,我已经设法使用自定义的Torii提供程序和自定义的简单Auth身份验证器来实现身份验证。

现在,我想使用自定义的Simple Auth Authorizer将访问令牌注入请求。

在文档https://github.com/simplabs/ember-simple-auth#implementing-a-custom-authorizer之后,我添加了一个自定义授权程序&初始化器

authorizers/myservice.js

代码语言:javascript
复制
import Base from 'simple-auth/authorizers/base';
import Ember from 'ember';

export default Base.extend({
  /**
    @method authorize
    @param {jqXHR} jqXHR The XHR request to authorize (see http://api.jquery.com/jQuery.ajax/#jqXHR)
    @param {Object} requestOptions The options as provided to the `$.ajax` method (see http://api.jquery.com/jQuery.ajaxPrefilter/)
  */
  authorize: function(jqXHR) {
    var accessToken = this.get('session.content.token');
    if (this.get('session.isAuthenticated') && !Ember.isEmpty(accessToken)) {
      jqXHR.setRequestHeader('Authorization', 'Bearer ' + accessToken);
    }
  }
});

initializers/authorization.js

代码语言:javascript
复制
import MyserviceAuthorizer from '../authorizers/myservice';

export function initialize(container, application) {
  container.register('authorizer:myservice', MyserviceAuthorizer);
}

export default {
  name: 'authorization',
  before: 'simple-auth',
  initialize: initialize
};

&包括在开发环境中的config/environment.js

代码语言:javascript
复制
ENV['simple-auth'] = {
  authorizer: 'authorizer:myservice',
  crossOriginWhitelist: ['*']
}

不幸的是,通过添加这一点,它现在已经破坏了身份验证。

看来Torii不再收到回复了。

The response from the provider is missing these required response params: access_token, token_type, expires_in

我在这里还包括了Torii提供程序代码&简单的Auth身份验证代码。

任何建议或帮助都将是非常感谢的,我对此有点执着。

torii-providers/myservice.js

代码语言:javascript
复制
import Provider from 'torii/providers/oauth2-bearer';
import {configurable} from 'torii/configuration';
import env from '../config/environment';

export default Provider.extend({
  name: 'myservice',
  baseUrl: (env.api_host + '/oauth/authorize'),

  responseParams: ['access_token', 'token_type', 'expires_in'],

  redirectUri: configurable('redirectUri', function(){
    // A hack that allows redirectUri to be configurable
    // but default to the superclass
    return this._super();
  })
});

和一个自定义的简单Auth认证器

authenticators/myservice.js

代码语言:javascript
复制
import Ember from 'ember';
import Base from 'simple-auth/authenticators/base';
import ajax from 'ic-ajax';

export default Base.extend({
  restore: function(data) {
    return new Ember.RSVP.Promise(function(resolve, reject) {
      if(!Ember.isEmpty(data.currentUser)) {
        resolve(data);
      } else {
        reject();
      }
    });
  },

  authenticate: function(options) {
    return this.fetchOauthData(options).then(this.fetchUserData.bind(this));
  },

  fetchUserData: function(oauthData) {
    var token = oauthData.token.access_token;
    return ajax({
        url: '/api/v1/users/me',
        type: "GET",
        beforeSend: function (xhr) {
          xhr.setRequestHeader("Authorization", "Bearer " + token);
        }
    }).then(function(userJSON){
      return {
        currentUser: userJSON.user,
        token: token
      };
    });
  },

  fetchOauthData: function(options) {
    return new Ember.RSVP.Promise(function(resolve, reject) {
      options.torii.open(options.provider).then(function(oauthData) {
        resolve({
          provider: oauthData.provider,
          token: oauthData.authorizationToken
        });
      }, function(error) {
        reject(error);
      });
    });
  }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 17:25:55

这可能与以下事实有关: Ember自动注册容器中app文件夹下的所有内容。尽管Ember文档的以下引用并没有清楚地解释这一点,但它给出了一个提示:

应用程序文件夹中的所有模块都可以由解析器加载,但通常情况下,类(如mixins和utils )应该使用import语句手动加载。

如果您的授权程序文件是app/authorizers/myservice.js,那么Ember将在容器上以'authorizer:myservice'名称注册它。容器将在查找单个实例时创建该实例。由于您在初始化器中执行相同的注册,因此可能会出现某种冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26972433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档