Desenvolvimento para dispositivos móveis

Notas de aula do prof. Eduardo da disciplina de Desenvolvimento para Dispositivos Móveis (curso técnico)

View on GitHub

Instalando as dependências do Passage

Para instalar as dependências do Passage, execute o seguinte comando:

npm install @passageidentity/passage-elements @passageidentity/passage-auth

Criando a página de Login

Vamos inicialmente criar a página de login. Para isso, vamos editar o arquivo src/views/LoginView.vue e adicionar o seguinte código:

<script setup>
import '@passageidentity/passage-elements/passage-auth';
</script>

<template>
  <h1>Login</h1>
  <div class="authContainer">
    <passage-auth
      app-id="APP_ID_QUE_ESTÁ_DISPONÍVEL_NO_DASHBOARD_DO_PASSAGE"
    ></passage-auth>
  </div>
</template>

<style></style>

Note que deve ser substituído o valor APP_ID_QUE_ESTÁ_DISPONÍVEL_NO_DASHBOARD_DO_PASSAGE pelo valor do Application ID que está disponível no dashboard do Passage.

Configurando o pinia e api para registro da autenticação

Vamos criar um arquivo para a chamada de API. Para isso, crie um arquivo chamado src/service/auth.js e adicione o seguinte código:

import axios from 'axios';

export default class AuthService {
  async postUserToken(token) {
    const response = await axios.get('/users/me/', {
      headers: {
        Authorization: `Bearer ${token}`,
      },
    });
    return response.data;
  }
}

Note que criamos um método postUserToken que faz uma chamada POST para a URL /users/me/ com o token do usuário. Esta URL está configurada no backend, e é responsável para receber o token enviado pelo Passage, validar o token e retornar o usuário autenticado. Caso o usuário ainda não esteja criado no backend, ele será criado e autenticado.

Em seguida, vamos criar um store para armazenar o token do usuário. Para isso, crie um arquivo chamado src/stores/auth.js e adicione o seguinte código:

import { ref } from 'vue';
import { defineStore } from 'pinia';

import AuthService from '@/service/auth';
const authService = new AuthService();

export const useAuthStore = defineStore('auth', () => {
  const user = ref({});

  async function setToken(token) {
    user.value = await authService.postUserToken(token);
  }

  function unsetToken() {
    user.value = {};
  }

  return { user, setToken, unsetToken };
});

Neste arquivo, criamos um store chamado auth que possui um ref chamado user e dois métodos: setToken e unsetToken. O método setToken faz uma chamada para o método postUserToken do AuthService e armazena o usuário autenticado no ref user. O método unsetToken limpa o ref user.

Ajustes no home para integração com o backend

O Passage foi configurado, na etapa anterior para que a URL de redirecionamento seja /. Para que o login funcione corretamente, é necessário fazer alguns ajustes ao redirecionar o usuário da página de login. Note que no nosso exemplo, a URL / é a página inicial do PWA. Para isso, vamos editar o arquivo src/views/HomeView.vue e adicionar o seguinte código:

<script setup>
import { onMounted } from 'vue';
import { PassageUser } from '@passageidentity/passage-elements/passage-user';
import { useAuthStore } from '@/stores/auth';

const authStore = useAuthStore();

const getUserInfo = async () => {
  try {
    const authToken = localStorage.getItem('psg_auth_token');
    const passageUser = new PassageUser(authToken);
    const user = await passageUser.userInfo(authToken);
    if (user) {
      await authStore.setToken(authToken);
    } else {
      authStore.unsetToken();
    }
  } catch (error) {
    authStore.unsetToken();
  }
};

onMounted(() => {
  getUserInfo();
});
</script>

<template>
  <product-list />
</template>

Note que ao carregar a página, o método getUserInfo é chamado. Este método faz uma chamada para o método userInfo do PassageUser e verifica se o usuário está autenticado. Caso o usuário esteja autenticado, o token é armazenado no store auth. Caso o usuário não esteja autenticado, o token é removido do store auth.

Verificando a autenticação

Para verificar se o usuário está autenticado, você pode abrir o Vue DevTools e verificar o store auth. Caso o usuário esteja autenticado, o store auth deve conter as informações do usuário.

Enviando o token nas requisições para o backend

Como última etapa, vamos garantir que o token seja enviado nas requisições para o backend. Para isso, vamos editar o arquivo src/plugins/axios.js e adicionar o seguinte código:

axios.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('psg_auth_token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  },
);

Como isso, o token será enviado em todas as requisições para o backend, como um cabeçalho Authorization.

< Configuração do Passage Sumário >