2016-10-09 5 views
0

Я пытаюсь сделать авторизацию в своем приложении ember.Ember simple auth не отправляет заголовок auth в api

Его работа на стороне клиента, но ember не прикрепляет токен-носитель к запросу api.

Мой адаптер

`import DS from 'ember-data'; 
import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; 

export default DS.JSONAPIAdapter.extend(DataAdapterMixin, { 
    host: 'http://localhost/money-app-api/web/app_dev.php/api', 
    authorizer: 'authorizer:application' 
}); 

Мой доверитель:

`import Ember from 'ember'; 
import OAuth2Bearer from 'ember-simple-auth/authorizers/oauth2-bearer'; 
const { isEmpty } = Ember; 

export default OAuth2Bearer.extend({ 
authorize(data, block) { 
const accessToken = data['access_token']; 
if (!isEmpty(accessToken)) { 
    block('Authorization', `Bearer ${accessToken}`); 
}` 

в авторизатор маркер доступа будет существует и является правильным. Мой api тоже правильный, я тестировал его Postman.

+0

Опишите свой вопрос в заголовке. –

ответ

1

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

//folders and files tree 
    adapters 
    --- application.js 
    authenticators 
    --- oauth2.js 
    authorizers 
    ---- oauth2-bearer.js 

адаптеры/application.js

import DS from 'ember-data'; 
import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; 

export default DS.JSONAPIAdapter.extend(DataAdapterMixin,{ 
    authorizer: 'authorizer:oauth2-bearer', 
    host: 'http://localhost/money-app-api/web/app_dev.php', 
    namespace: 'api' 
}); 

аутентификаторы/oauth2.js

import OAuth2PasswordGrant from 'ember-simple-auth/authenticators/oauth2-password-grant'; 

export default OAuth2PasswordGrant.extend({ 
    serverTokenEndpoint: 'http://localhost/money-app-api/web/app_dev.php/token' 
}); 

authorizers/OAuth2-bearer.js

export { default } from 'ember-simple-auth/authorizers/oauth2-bearer'; 

так что теперь в вашем маршруте , application.js, вы можете чтобы использовать следующий код: это просто для демонстрационной цели, которую вам нужно изменить по мере необходимости.

this.get('session').authorize('authorizer:oauth2-bearer', (headerName, headerValue) => { 
      headers[headerName] = headerValue; 
     }); 

Я пишу аутентификацию в route/application.js, чтобы уточнить больше. в этом примере я получаю информацию об учетной записи и пользователя на основе сеанса, который уже прошел проверку подлинности.

import Ember from 'ember'; 
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin'; 
import config from '../config/environment'; 

export default Ember.Route.extend(ApplicationRouteMixin, { 

    model() { 
    return Ember.RSVP.hash({ 
     account: new Ember.RSVP.Promise((resolve, reject) => { 

     if (!this.get('session.isAuthenticated')) { 
      resolve({}); 
      return; 
     } 

     let store = this.store, 
      session = this.get('session'); 

     let headers = {}; 

     this.get('session').authorize('authorizer:oauth2-bearer', (headerName, headerValue) => { 
      headers[headerName] = headerValue; 
     }); 

     return Ember.$.ajax(config.apiUrl + '/api/account', { 
      headers: headers 
     }).then(data => { 
      if (data) { 
      store.pushPayload(data); 
      resolve(store.peekRecord('user', data.data.id)); 
      } else { 
      reject({}); 
      session.invalidate(); 
      } 
     }).fail(() => { 
      session.invalidate(); 
     }); 
     }) 
    }); 
    }, 
    sessionAuthenticated() { 
    this.refresh(); 
    this._super(); 
    } 
}); 

Надеюсь, это может решить вашу проблему.

важный совет:

The REST adapter allows your store to communicate with an HTTP server by 
    transmitting JSON via XHR. Most Ember.js apps that consume a JSON API 
    should use the REST adapter. 
    ### Headers customization 
    Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary 
    headers can be set as key/value pairs on the `RESTAdapter`'s `headers` 
    object and Ember Data will send them along with each ajax request. 
    ```app/adapters/application.js 
    import DS from 'ember-data'; 
    export default DS.RESTAdapter.extend({ 
    headers: { 
     "API_KEY": "secret key", 
     "ANOTHER_HEADER": "Some header value" 
    } 
    }); 
    ``` 
    `headers` can also be used as a computed property to support dynamic 
    headers. In the example below, the `session` object has been 
    injected into an adapter by Ember's container. 
    ```app/adapters/application.js 
    import DS from 'ember-data'; 
    export default DS.RESTAdapter.extend({ 
    headers: Ember.computed('session.authToken', function() { 
     return { 
     "API_KEY": this.get("session.authToken"), 
     "ANOTHER_HEADER": "Some header value" 
     }; 
    }) 
    }); 
    ``` 

Source

+0

У меня есть и его работа для меня. Но моя проблема заключается в том, что ember не прикрепляет заголовок к json-адаптеру. –

+0

Я просто добавил совет для отправки заголовков в адаптер, что должно помочь вашей проблеме. попробуйте. – Majid

0

Моя единственная проблема в том, что я не authorization в моих принимают заголовки в апи

allow_headers: ['origin', 'X-Custom-Auth', 'Content-Type', 'Authorization']

Это странно, потому что, когда испытал Postman, все работало.