0
votes

I'm using JWT authentication, using ember-simple-auth for implementing user authentication. I m providing necessary details in my project below.

When Authenticated correctly a jwt token is passing from the backend made of djangorest and it contains only a token.

/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);
    }
  }
});

As I tried to access the token using session.data.authenticated.token it shows the value undefined.

1
Please read Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - the summary is that this is not an ideal way to address volunteers, and is probably counterproductive to obtaining answers. Please refrain from adding this to your questions.halfer

1 Answers

1
votes

If your response from /auth looks like this:

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

and you can use the JWT page to decode it and it works then check to see if session.session.content.authenticated is defined. It should hold the token string. If it is you should be able to decode it and use the information... something like:

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));
})

You can just add that to your application controller or make it a service to use it all over your site.