Angular 2+: Login

View on Github

Angular 2+: Login

Gravatar for
By Andres Aguiar

This tutorial demonstrates how to add user login to an Angular (versions 2 and above) application using Auth0. We recommend you to Log in to follow this quickstart with examples configured for your account.

I want to explore a sample app

2 minutes

Get a sample configured with your account settings or check it on Github.

View on Github
System requirements: Angular 2+

New to Auth? Learn How Auth0 works, how it integrates with Single Page Applications and which protocol it uses.

Configure Auth0

Get Your Application Keys

When you signed up for Auth0, a new application was created for you, or you could have created a new one.

You will need some details about that application to communicate with Auth0. You can get these details from the Application Settings section in the Auth0 dashboard.

You need the following information:

  • Client ID
  • Domain

If you download the sample from the top of this page these details are filled out for you.

If you have more than one application in your account, the sample comes with the values for your Default App.

App Dashboard

Configure Callback URLs

A callback URL is a URL in your application where Auth0 redirects the user after they have authenticated.

You need to whitelist the callback URL for your app in the Allowed Callback URLs field in your Application Settings. If you do not set any callback URL, your users will see a mismatch error when they log in.

If you are following along with the sample project you downloaded from the top of this page, you should set the Allowed Callback URL to http://localhost:3000/callback.

Integrate Auth0 in your Application

Install auth0.js

You need the auth0.js library to integrate Auth0 into your application.

Install auth0.js using npm or yarn.

# installation with npm
npm install --save auth0-js

# installation with yarn
yarn add auth0-js

Once you install auth0.js, add it to your build system or bring it in to your project with a script tag.

<script type="text/javascript" src="node_modules/auth0-js/build/auth0.js"></script>

If you do not want to use a package manager, you can retrieve auth0.js from Auth0's CDN.

<script src=""></script>

Authentication with Auth0

Universal Login is the easiest way to set up authentication in your application. We recommend using it for the best experience, best security and the fullest array of features. This guide will use it to provide a way for your users to log in to your Angular 2+ application.

You can also embed the login dialog directly in your application using the Lock widget. If you use this method, some features, such as single sign-on, will not be accessible. To learn how to embed the Lock widget in your application, follow the Embedded Login sample.

When a user logs in, Auth0 returns three items:

You can use these items in your application to set up and manage authentication.

Create an Authentication Service

Create a service to manage and coordinate user authentication. You can give the service any name. In the examples below, the service is AuthService and the filename is auth.service.ts.

In the service add an instance of the auth0.WebAuth object. When creating that instance, you can specify the following:

  • Configuration for your application and domain
  • Response type, to show that you need a user's Access Token and an ID Token after authentication
  • Audience and scope, specifying that you need an access_token that can be used to invoke the /userinfo endpoint.
  • The URL where you want to redirect your users after authentication.

In this tutorial, the route is /callback, which is implemented in the Add a Callback Component step.

Add _idToken, _accessToken, _expiresAt properties to AuthService Class to store the ID Token, Access Token and Access Token's expiry time respectively. This values will be populated on successful auth. Add the getters for the ID Token and the Access Token.

Add a login method that calls the authorize method from auth0.js.

// src/app/auth/auth.service.ts

import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { filter } from 'rxjs/operators';
import * as auth0 from 'auth0-js';

export class AuthService {

  private _idToken: string;
  private _accessToken: string;
  private _expiresAt: number;

  auth0 = new auth0.WebAuth({
    clientID: 'YOUR_CLIENT_ID',
    domain: 'YOUR_AUTH0_DOMAIN',
    responseType: 'token id_token',
    redirectUri: 'http://localhost:3000/callback',
    scope: 'openid'

  constructor(public router: Router) {
    this._idToken = '';
    this._accessToken = '';
    this._expiresAt = 0;

  get accessToken(): string {
    return this._accessToken;

  get idToken(): string {
    return this._idToken;

  public login(): void {


Checkpoint: Try to call the login method from somewhere in your application to see the login page. For example, you can trigger the method from a button click or a lifecycle event.

hosted login

Finish the Service

Add more methods to the AuthService service to handle authentication in the app.

The example below shows the following methods:

  • handleAuthentication: looks for the result of authentication in the URL hash. Then, the result is processed with the parseHash method from auth0.js.
  • setSession: stores the user's Access Token, ID Token, and the Access Token's expiry time in AuthService properties.
  • renewSession: performs silent authentication to renew the session.
  • logout: removes the user's tokens and expiry time from AuthService properties.
  • isAuthenticated: checks whether the expiry time for the user's Access Token has passed.
// src/app/auth/auth.service.ts

// ...
export class AuthService {

  // ...
  public handleAuthentication(): void {
    this.auth0.parseHash((err, authResult) => {
      if (authResult && authResult.accessToken && authResult.idToken) {
        window.location.hash = '';
      } else if (err) {

  private setSession(authResult): void {
    // Set isLoggedIn flag in localStorage
    localStorage.setItem('isLoggedIn', 'true');
    // Set the time that the access token will expire at
    const expiresAt = (authResult.expiresIn * 1000) + new Date().getTime();
    this._accessToken = authResult.accessToken;
    this._idToken = authResult.idToken;
    this._expiresAt = expiresAt;

  public renewSession(): void {
    this.auth0.checkSession({}, (err, authResult) => {
      if (authResult && authResult.accessToken && authResult.idToken) {
      } else if (err) {
        alert(`Could not get a new token (${err.error}: ${err.error_description}).`);

  public logout(): void {
    // Remove tokens and expiry time
    this._accessToken = '';
    this._idToken = '';
    this._expiresAt = 0;
    // Remove isLoggedIn flag from localStorage
    // Go back to the home route

  public isAuthenticated(): boolean {
    // Check whether the current time is past the
    // access token's expiry time
    return new Date().getTime() < this._expiresAt;


Provide a Login Control

Provide a template with controls for the user to log in and out.

<!-- src/app/app.component.html -->

<nav class="navbar navbar-default">
  <div class="container-fluid">
    <div class="navbar-header">
      <a class="navbar-brand" href="#">Auth0 - Angular</a>

        class="btn btn-primary btn-margin"

        class="btn btn-primary btn-margin"
          Log In

        class="btn btn-primary btn-margin"
          Log Out


<main class="container">

This example uses Bootstrap styles. You can use any style library, or not use one at all.

Depending on whether the user is authenticated or not, they see the Log In or Log Out button. The click events on the buttons make calls to the AuthService service to let the user log in or out. When the user clicks Log In, they are redirected to the login page.

The login page uses the Lock widget. To learn more about Universal Login and the login page, see the Universal Login documentation. To customize the look and feel of the Lock widget, see the Lock customization options documentation.

Add a Callback Component

When you use Universal Login, your users are taken away from your application. After they authenticate, they are automatically returned to your application and a client-side session is set for them.

This example assumes you are using the default Angular path-based routing. If you are using hash-based routing with { useHash: true }, you will not be able to specify a dedicated callback route. The URL hash will be used to hold the user's authentication information.

You can select any URL in your application for your users to return to. We recommend creating a dedicated callback route. If you create a single callback route:

  • You don't have to whitelist many, sometimes unknown, callback URLs.
  • You can display a loading indicator while the application sets up a client-side session.

Create a component named CallbackComponent and add a loading indicator.

To display a loading indicator, you need a loading spinner or another indicator in the assets directory. See the downloadable sample for demonstration.

<!-- app/callback/callback.html -->

<div class="loading">
  <img src="assets/loading.svg" alt="loading">

After authentication, your users are taken to the /callback route. They see the loading indicator while the application sets up a client-side session for them. After the session is set up, the users are redirected to the /home route.

Handle Authentication Tokens

When a user authenticates at the login page, they are redirected to your application. Their URL contains a hash fragment with their authentication information. The handleAuthentication method in the AuthService service processes the hash.

Call the handleAuthentication method in your app's root component. The method processes the authentication hash while your app loads.

// src/app/app.component.ts

import { Component } from '@angular/core';
import { AuthService } from './auth/auth.service';

  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
export class AppComponent implements OnInit {

  constructor(public auth: AuthService) {

  ngOnInit() {
    if (localStorage.getItem('isLoggedIn') === 'true') {

Use Auth0 for FREE