Search code examples
expressember.jsjwtpassport.jspassport-local

How to implement a login page with JSON Web Token in Ember app with express api


I added authentication for my Express API following this guide and after testing my secret-routes everything seems to work properly. Now my question is how can this be used in an Ember app login page. After receiving the secret token after a successful login how does the browser know you are signed in. How would one log out? How does the ember application know who is signed in? Is there any thing in particular security wise that I should be at tentative to while working on this?


Solution

  • You should use addons to handle most of the heavy lifting for you.

    ember-simple-auth-token has setup directions that have you create a login route which will take a username / password and send it to your server for validation. The token response will then be available in your app until the user logs out.

    The example looks like

    import Controller from '@ember/controller';
    import { inject } from '@ember/service';
    
    export default Controller.extend({
      session: inject('session'),
    
      actions: {
        authenticate: function() {
          const credentials = this.getProperties('username', 'password');
          const authenticator = 'authenticator:token'; // or 'authenticator:jwt'
    
          this.get('session').authenticate(authenticator, credentials);
        }
      }
    });
    

    You also create the logout route which handles logging out of your app as well as sending any logout request to the server.

    If possible you should align your server to the defaults, but you can configure nearly everything.

    Authentication Options

    ENV['ember-simple-auth-token'] = {
      tokenDataPropertyName: 'tokenData'; // Key in session to store token data
      refreshAccessTokens: true, // Enables access token refreshing
      tokenExpirationInvalidateSession: true, // Enables session invalidation on token expiration
      serverTokenRefreshEndpoint: '/api/token-refresh/', // Server endpoint to send refresh request
      refreshTokenPropertyName: 'refresh_token', // Key in server response that contains the refresh token
      tokenExpireName: 'exp', // Field containing token expiration
      refreshLeeway: 0 // Amount of time to send refresh request before token expiration
    };
    

    We've been very happy with this addon in production for 3 years and I'd highly recommend it.