Nuxt Laravel Password OAuth

I needed to use Oauth using laravel password using nuxt, as I learned, in my opinion the most complicated thing about Nuxt is the Auth. It's just not enough detailed information on the documentation for a new user to jump into this also there's not much people using this Oauth laravel passport approach but there's a lot of JWT auth approach everywhere.

My case is I need 1 domain for login and domain, so I can use in other domain. My structure will be like this

  • Login Domain ( Laravel Passport )
  • - Domain 1 ( Nuxt )
  • - Domain 2 (Laravel )
  • - Mobile ( Android )

I'm new to Nuxt, tried it and loved it. Have a bit of experience of vue but I think I took a jump on learning Vue and went straight to Nuxt. I know from experience you need basic understanding of Nuxt before jumping straight to Oauth. That's why I bought this course from udemy

https://www.udemy.com/course/nuxtjs-vuejs-on-steroids/

even though in youtube there's a lot of this but i needed something more focused.

The way I did it, first install the laravel passport this is straight forward just follow the documentation make sure you use php artisan passport:client to get key for oauth.

https://laravel.com/docs/7.x/passport

Then in Nuxt when you search Nuxt Oauth Laravel Passport it just show this simple documentation

https://auth.nuxtjs.org/providers/laravel-passport.html

First install @nuxtjs/auth, then in nuxt config

auth: {
    redirect: {
      login: '/login',
      logout: '/',
      callback: '/auth/callback',
      user: '/'
    },
    strategies: {
      'laravel.passport': {
        url: process.env.LARAVEL_ENDPOINT,
        client_id: process.env.PASSPORT_CLIENT_ID,
        client_secret: process.env.PASSPORT_CLIENT_SECRET,
        userinfo_endpoint: process.env.LARAVEL_ENDPOINT + '/api/oauth/me',
      }
    }
  }

Then grab the login.vue from the documentation

<template>
  <section class="container">
    <div>
      <form>
        <div>
          <label for="username">Username</label>
          <input v-model="user.username" name="username">
        </div>
        <div>
          <label for="password">Password</label>
          <input v-model="user.password" type="password" name="password">
        </div>
        <div>
          <button type="submit" @click.prevent="passwordGrantLogin">
            Login with Password Grant
          </button>
        </div>

        <div>
          <button type="submit" @click.prevent="customPasswordGrantLogin">
            Login with Custom Passport Password Scheme
          </button>
        </div>
      </form>
    </div>
    <hr>
    <div>
      <button @click="oauthLogin">
        Login with OAuth
      </button>
    </div>
  </section>
</template>

<script>
export default {
  auth: false,
  data () {
    return {
      user: {
        username: '',
        password: ''
      }
    }
  },
  methods: {
    async passwordGrantLogin () {
      await this.$auth.loginWith('password_grant', {
        data: {
          grant_type: 'password',
          client_id: process.env.PASSPORT_PASSWORD_GRANT_ID,
          client_secret: process.env.PASSPORT_PASSWORD_GRANT_SECRET,
          scope: '*',
          username: this.user.username,
          password: this.user.password
        }
      })
      this.$router.replace('/')
    },
    async customPasswordGrantLogin () {
      await this.$auth.loginWith('password_grant_custom', {
        data: this.user
      })
      this.$router.replace('/')
    },
    oauthLogin () {
      this.$auth.loginWith('laravel.passport')
    }
  }
}
</script>

<style scoped>
div {
  margin: 10px 0;
}
</style>

When Pressing login with oauth thats where the magic happens

Troubleshooting


loginWith promise result is undefined

Check if auth @nuxtjs/auth is installed

loginWith Uncaught (in promise) TypeError: Object(...) is not a function

npm i nanoid@2.1.11