Модуль nuxt-auth отлично работает с локальными учетными записями и входами в социальные сети, но все становится беспорядочно, когда вы пытаетесь обменять токены входа в социальные сети с вашим локальным токеном API. Модуль аутентификации nuxt не поддерживает пользовательские потоки аутентификации с использованием учетных записей социальных сетей. Фактически, nuxt-auth выполняет вход в социальную сеть, но не позволяет вам обменивать социальный токен на ваш собственный токен. Поэтому я создал это руководство, чтобы упростить вам задачу.

Итак, вот как содержать его в чистоте. Сначала клонируйте базовое приложение из моего github. Это из моего предыдущего руководства по модулю nuxt-auth. Ознакомьтесь с моей более ранней статьей о nuxt-auth, чтобы получить подробное описание загруженного проекта.

Я использовал epic-spinners для загрузки анимации. Вы можете установить эпические спиннеры, используя следующую команду.

npm install --save epic-spinners

Затем создайте плагин spinners.js в папке плагинов, чтобы включить в свой проект эпические прядильщики.

import Vue from 'vue'
import { SemipolarSpinner } from 'epic-spinners'
Vue.component('semipolar-spinner', SemipolarSpinner)

Затем включите плагин в nuxt.config.js

plugins: ['~plugins/spinners.js'],

Приступим к процессу аутентификации

Вот что мы собираемся делать. Сначала мы разрешим плагину nuxt-auth войти в систему с помощью социальной сети. Затем мы получим токен, полученный при обратном вызове от facebook, google или любой другой платформы. Затем мы отправим этот токен на наш собственный сервер и обменяем токен входа в социальную сеть на локальный токен. Затем мы принудительно установим локальный токен авторизации в модуле nuxt-auth. После этого нам нужно будет изменить стратегию на локальную, и, наконец, вы сможете получить локального пользователя из своего собственного API. Чтобы все было в порядке, мы создадим плагин для axios и включим все заголовки в плагин axios. Затем мы включим плагин в проект.

Первый

Вам следует изменить конфигурацию nuxt.auth, чтобы она соответствовала вашему потоку аутентификации. Вот как я это сделал.

auth: {
  strategies: {
    local: {
      endpoints: {
        login: {url: '/user/login', method: 'post', propertyName:      'token' },
        logout: false,
        user: {url: '/user/user', method: 'get', propertyName: 'data'},
      },
      tokenRequired: true,
      tokenType: 'Bearer'
    },
    facebook: {
      client_id: '',
      userinfo_endpoint: false,
      scope: ['public_profile', 'email'],
      redirect_uri:'http://localhost:3000/callback'
    },
    google: {
      client_id: '',
      user:false,
      redirect_uri:'http://localhost:3000/callback'

    },
  },
  redirect: {
    login: '/?login=1',
    logout: '/',
  }
},

Затем добавьте свою конечную точку API, чтобы она работала как базовая.

axios: {
     baseURL:'https://aaa.com/api/v1'
  },

Я намеренно удалил остальную часть конфигурации. Обратитесь к данному github для полной конфигурации.

Второй

Давайте настроим axios. Здесь я создам плагин, чтобы хранить все заголовки в одном месте. Для начала создайте файл с именем axios.js в подключаемых модулях и включите его в nuxt.config.js. Вот вид минимальной конфигурации nuxt после включения соответствующих подключаемых модулей.

plugins: [‘~plugins/axios.js’,’~plugins/spinners.js’]

Затем поместите следующий код в axios.js в папке плагинов.

export default function ({$axios, redirect}) {
    $axios.onRequest(config => {
        config.headers['Content-Type'] = 'application/json';
        config.headers['Access-Control-Allow-Origin'] = "*";
    })
}

Если вам нужно больше заголовков, просто включите их в плагин axios, и axios автоматически вставит заголовки при отправке запроса.

Теперь, когда у нас есть настройки axios. Давайте создадим настраиваемый плагин аутентификации. Создайте новый файл с именем auth.js в папке плагинов и введите следующий код.

export default async function ({ app }) {
    if (!app.$auth.loggedIn) {
        return
    }
const auth = app.$auth;
const authStrategy = auth.strategy.name;
    if(authStrategy === 'facebook' || authStrategy === 'google'){
        const token = auth.getToken(authStrategy).substr(7)
        const authStrategyConverted = authStrategy === 'facebook' ? 'fb' : 'google';
        const url = `/user/signup/${authStrategyConverted}?token=${token}`;
try {
            const {data} = await app.$axios.$post(url, null);
            auth.setToken('local', "Bearer "+ data.access_token);
            setTimeout( async () => {
                auth.setStrategy('local');
                setTimeout( async () => {
                    await auth.fetchUser();
                })
            });
        } catch (e) {
            console.log(e);
        }
    }
}

Как вы знаете, модуль nuxt-auth сохраняет состояние входа в систему в переменной $ auth.loggedIn. Следовательно, сначала мы должны проверить, вошел ли уже пользователь в систему. Если не вошел в систему, этот метод должен завершиться. Помните, что я говорил вам ранее: мы должны позволить модулю nuxt-auth войти в систему, прежде чем мы вмешаемся. Затем мы скопируем зарегистрированный статус в переменную, чтобы нам не приходилось повторять $ nuxt.auth в коде.

Затем я получаю доступ к стратегии. Это важно, поскольку мы настраиваем процесс авторизации в социальных сетях. Вы можете получить доступ к текущей зарегистрированной стратегии из nuxt-auth через auth.strategy.name (app. $ Auth.strategy.name). Мы делаем это только для того, чтобы разрешить вход в социальные сети. Затем получите сохраненный токен доступа для входа в социальную сеть из nuxt-auth через auth.getToken (authStrategy) .substr (7). Здесь auth.getToken («название стратегии») - это метод по умолчанию, встроенный в nuxt-auth. Обратитесь к документации для получения дополнительной информации.

const authStrategyConverted = authStrategy === 'facebook' ? 'fb' : 'google';
const url = `/user/signup/${authStrategyConverted}?token=${token}`;

Используя приведенный выше код, я создаю URL-адрес на основе стратегии. Затем отправьте пост-вызов на свою конечную точку, чтобы получить пользовательский токен и установить локальный токен на Vuex с помощью метода auth.setToken («стратегия», токен). Ваш API должен получить социальный токен, получить соответствующую информацию о пользователе и выдать токен доступа.
Стратегия здесь должна быть локальной. Затем измените стратегию на локальную, используя метод auth.setStrategy («стратегия»).

Наконец, включите этот плагин в nuxtjs по всему миру.

plugins: ['~plugins/auth.js','~plugins/axios.js','~plugins/spinners.js']

Вот ссылка репо на github. Это конец урока ❤

GITHUB REPO

git clone https://github.com/rama41222/NuxtMedium.git