Не удается получить доступ к данным сеанса в Ember (данные токена JWT) - PullRequest
0 голосов
/ 23 октября 2018

Я использую аутентификацию JWT, использую ember-simple-auth для реализации аутентификации пользователя.Я предоставляю необходимые детали в моем проекте ниже.

При правильной аутентификации токен jwt проходит от серверной части, изготовленной из djangorest, и содержит только токен.

/ app / authenticators /jwt.js

import Ember from 'ember';
import Base from 'ember-simple-auth/authenticators/base';
import config from '../config/environment';

const { RSVP: { Promise }, $: { ajax }, run } = Ember;
export default Base.extend({

  tokenEndpoint: `http://localhost:8000/auth`,

  restore(data) {
    return new Promise((resolve, reject) => {
      // console.log(data.token); token seems empty
      if (!Ember.isEmpty(data.token)) {
        resolve(data);
      } else {
        reject();
      }
    });
  },

  authenticate(creds) {
    const { identification, password } = creds;
    const data = JSON.stringify({
        email: identification,
        password: password
    });
    const requestOptions = {
      url: this.tokenEndpoint,
      type: 'POST',
      data,
      contentType: 'application/json',
      dataType: 'json'
    };
    return new Promise((resolve, reject) => {
      ajax(requestOptions).then((response) => {
        // console.log(response); verified
        const { jwt } = response;
        // Wrapping aync operation in Ember.run
        run(() => {
          resolve({
            token: jwt
          });
        });
      }, (error) => {
        // Wrapping aync operation in Ember.run
        run(() => {
          reject(error);
        });
      });
    });
  },

   invalidate(data) {
     return Promise.resolve(data);
   }
});

/ app / authorizer / custom.js

import Base from 'ember-simple-auth/authorizers/base';
// import Ember from 'ember';
import { inject } from '@ember/service';

export default Base.extend({
  session: inject('session'),
  authorize(data, block) {
    const { token } = data
    if (this.get('session.isAuthenticated') && token) {
      consol.log(token);
      // this._super(...arguments);
      block('Authorization', `JWT ${token}`);
      console.log(Authorization);
    }
  }
});

Когда я пытался получить доступ к токену, используя session.data.authenticated.token, он показывает значение undefined .

1 Ответ

0 голосов
/ 24 октября 2018

Если ваш ответ от /auth выглядит следующим образом:

{access_token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDA0MTU0ODgsInN1YiI6MSwicm9sZSI6MCwibmFtZSI6IlJvYmVydG8iLCJlbWFpbCI6InJwbGFuY2FyQHRlc3QuY29tIn0.okZCipPGuPSmgC5B0h7QkldBkVPDvdut7I7u-fFE61w"}

, и вы можете использовать страницу JWT , чтобы декодировать его, и он работает, то проверьте, если session.session.content.authenticatedопределено.Он должен содержать строку токена.Если это так, вы должны быть в состоянии расшифровать его и использовать информацию ... что-то вроде:

tokenData: Ember.computed('session.session.content.authenticated', function(){
  var token = this.get('session.session.content.authenticated');
  var base64Url = token.split('.')[1];
  var base64 = base64Url.replace('-','+').replace('_', '/'); //so the atob function works 
  return JSON.parse(window.atob(base64));
})

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

...