API Platform + Nuxt - управление сессиями - PullRequest
0 голосов
/ 10 марта 2019

Я новичок в Nuxt и API Platform.Я создал базовый сервер и клиент и пытаюсь понять, как управлять сессиями.

Я могу войти исключительно на стороне клиента, например, используя поддержку Nuxt Auth0.Или я могу свернуть свой логин.Но это только на стороне клиента.Или я могу использовать форму входа на сервер Symfony и публиковать на нем сообщения от клиента, но это только на стороне сервера.

Мне нужно, чтобы Nuxt мог определить, вошел ли я в систему или нет.Symfony.Как правильно сделать это для универсального приложения Nuxt, использующего платформу API?Промежуточное?Серверное промежуточное ПО?nuxtServerInit?

1 Ответ

0 голосов
/ 15 марта 2019

У меня есть кое-что, что работает, поэтому я решил опубликовать здесь, на случай, если другим людям будет полезно иметь несколько указателей.

Основная идея:

  • На стороне Nuxt используйте промежуточное ПО, чтобы проверить, вошли ли мы на сервер до того, как произойдет отрисовка остальной части страницы.
  • На стороне платформы API настройте аутентификацию JWT согласно здесь . Это дает нам токен, который мы будем отправлять на запросы API для их проверки.

В клиенте Nuxt вам необходимо хранилище, которое обрабатывает состояние входа в систему. Вот моя текущая версия WIP (поэтому я не утверждаю, что это отличный код):

import axios from 'axios'

export default function({ store, redirect }) {
  store.commit('security/AUTHENTICATING')

  // Add token header if we have it.
  const token = store.state.security.token

  if (token) {
    axios.defaults.headers.common.Authorization = 'Bearer ' + token.toString()
  } else {
    axios.defaults.headers.common.Authorization = null
  }

  // Now make an API call to see if we're logged in.
  return axios
    .get(process.env.API + '/locations')
    .then(response => {
      // We're logged in.  No need to save the token - it's already in the store.
      store.commit('security/AUTHENTICATING_SUCCESS', null)
    })
    .catch(() => {
      // We're not logged in.
      if (store.state.security.isAuthenticated) {
        // ...but we thought we were. Correct our misapprehension.
        store.commit('security/LOGOUT')
      }

      // Ask them to log in.
      return redirect('/login')
    })
}

Затем настройте промежуточное программное обеспечение:

    import axios from 'axios'
    
    export default function({ store, redirect }) {
      store.commit('security/AUTHENTICATING')
    
      // Add token header if we have it.
      const token = store.state.security.token
    
      if (token) {
        axios.defaults.headers.common.Authorization = 'Bearer ' + token.toString()
      } else {
        axios.defaults.headers.common.Authorization = null
      }
    
      // Now make an API call to see if we're logged in.
      return axios
        .get(process.env.API + '/locations')
        .then(response => {
          // We're logged in.  No need to save the token - it's already in the store.
          store.commit('security/AUTHENTICATING_SUCCESS', null)
        })
        .catch(() => {
          // We're not logged in.
          if (store.state.security.isAuthenticated) {
            // ...but we thought we were. Correct our misapprehension.
            store.commit('security/LOGOUT')
          }
    
          // Ask them to log in.
          return redirect('/login')
        })
    }

Я еще не совсем доволен этим, и я уверен, что могло бы быть и лучше. Но что-то в этом роде похоже на то, что оно сделает свою работу.

...