JAMstack Netlify Workshop


Simple protection

(but paid)

Simple protection

(not paid, more dev)

Simple protection

(not paid, more dev)


logins, managing users

<!DOCTYPE html>
  <title>A static website</title>

  <!-- include the widget -->
  <script type="text/javascript" src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>
  <!-- Add a menu:
   Log in / Sign up - when the user is not logged in
   Username / Log out - when the user is logged in
  <div data-netlify-identity-menu></div>

  <!-- Add a simpler button:
    Simple button that will open the modal.
  <div data-netlify-identity-button>Login with Netlify Identity</div>

Vanilla HTML/JS

// Open the modal

// Get the current user:
const user = netlifyIdentity.currentUser();

// Bind to events
netlifyIdentity.on('init', user => console.log('init', user));
netlifyIdentity.on('login', user => console.log('login', user));
netlifyIdentity.on('logout', () => console.log('Logged out'));
netlifyIdentity.on('error', err => console.error('Error', err));
netlifyIdentity.on('open', () => console.log('Widget opened'));
netlifyIdentity.on('close', () => console.log('Widget closed'));

// Close the modal

// Log out the user

Vanilla HTML/JS

In Vue:

yarn add netlify-identity-widget
const netlifyIdentity = require('netlify-identity-widget');
import netlifyIdentity from 'netlify-identity-widget';

  container: this.refs.netlifymodal // defaults to document.body, you

// Access the underlying GoTrue JS client.
// Note that doing things directly through the GoTrue client 
// brings a risk of getting out of
// sync between your state and the widget’s state.
const opts = {netlifyIdentity.init({  
  // container to attach to, in the last example we used refs
  container: '#some-query-selector'; 
  // Absolute url to endpoint.  ONLY USE IN SPECIAL CASES!
  APIUrl: 'https://www.example.com/.netlify/functions/identity'; 
  // custom placeholder for name input form
  namePlaceholder: 'some-placeholder-for-Name'; 
  // or false if you don't want the netlify logo
  logo: true; 
methods: {
  login() {
      netlifyIdentity.on("login", user => {
        this.currentUser = {
          username: user.user_metadata.full_name,
          email: user.email,
          access_token: user.token.access_token,
          expires_at: user.token.expires_at,
          refresh_token: user.token.refresh_token,
          token_type: user.token.token_type,
          avatar: user.user_metadata.avatar_url
            ? user.user_metadata.avatar_url
            : null
        this.$store.commit("setUser", this.currentUser);
        if (this.currentUser) this.$store.commit("updateLoggedInState", true);
export const store = new Vuex.Store({
  state: {
    user: window.localStorage.getItem("user")
  getters: {
    loggedIn: state => !!state.user,
    getUser: state => JSON.parse(state.user)
  mutations: {
    setUser: (state, currentUser) => {
      if (!currentUser) {
        state.user = null
      let theUser = JSON.stringify(currentUser)
      state.user = theUser
      window.localStorage.setItem("user", theUser)

In the store:


Take a simple Vue CLI site,

install Vue Router and Vuex

make identity work from a button,

and protect a route.