[go: up one dir, main page]

Skip to content

TaffarelXavier/autenticacao-com-sessao-no-adonis

Repository files navigation

Autenticação no Adonis Usando Sessão

1º Passo:

Criar o projeto Adonis

adonis new autenticacao-com-sessao --api-only

2º Passo:

Instalar o Sqlite3

npm install sqlite3 --save
ou
yarn add sqlite3 Seguir este passo: (https://yarnpkg.com/en/package/sqlite3)

3º Passo:

Executar as migrações:

adonis migration:run

4º Passo:

Criar o controller Session:

adonis make:controller Session --type http

5º Passo:

No novo controller criado (App/Controllers/Http/SessionController) , criaremos quatro métodos, a saber:

  1. register - Cadastrará algum usuário
  2. login - Para fazer o login do usuário
  3. show - Mostra o usuário logado
  4. logout - Faz o logout

Antes de criarmos esses métodos, importaremos o model User no SessionController (App/Controllers/Http/SessionController.js), desta forma:

"use strict";

//Importação:
const User = use('App/Models/User');

class SessionController {}

Criação dos métodos
5.1 Register app/Controllers/Http/SessionController.js

async register({ auth, request, response }) {
    let user = await User.create(request.all());

    return response.json(user);
  }

5.2 Login app/Controllers/Http/SessionController.js

 async login({ auth, request, response  }) {
    const { email, password } = request.all();

    try {
      let result = await auth.attempt(email, password);
      return result;
    } catch (error) {
      let errorUser = error.message.startsWith("E_USER_NOT_FOUND");
      let errorPass = error.message.startsWith("E_PASSWORD_MISMATCH");
      let info = { type: "another", message: error.message };

      if (errorUser) {
        info = { type: "user", message: "E_USER_NOT_FOUND" };
      } else if(errorPass) {
        info = { type: "pass", message: "E_PASSWORD_MISMATCH" };
      }
      return response.status(403).send(info);
    }
  }

5.3 Show app/Controllers/Http/SessionController.js

 async show({ auth, params }) {
    if (auth.user.id !== Number(params.id)) {
      return "You cannot see someone als's profile";
    }
    return auth.user;
  }

5.4 Logout

 async logout({ request, response, auth }) {
    try {
      const isLogeddin = await auth.check();
      if (isLogeddin) {
        await auth.logout();
      }
      return response.status(401).send({ alert: "DESCONECTADO" });
    } catch (error) {
      response.status(401).send({ alert: "NOT_LOGGEDED" });
    }
  }

6º Passo:

Criando as rotas

// Essas rotas devem ser acessíveis apenas //
quando você não está logado
Route.group(() => {
  //Faz o login
  Route.post("/login", "SessionController.login")
  //Cadastrar um novo usuário:
  Route.post('/register', 'SessionController.register')
}).middleware(['guest'])


// Essas rotas devem ser acessíveis apenas
// quando você está logado
Route.group(() => {
//Buscar um usuário pelo ID dele
Route.get("users/:id", "SessionController.show").middleware("auth");

//Faz o logout
Route.get("/logout", "SessionController.logout");
}).middleware(['auth'])

7º Passo:

Testes

Criar as rotas:

http://127.0.0.1:3004/register

Campos: username, email e password

http://127.0.0.1:3004/login

Campos: email e password

http://127.0.0.1:3004/users/1

Ou baixar o arquivo Insomnia_2020-01-02.json e use-o no Insomnia.

8º Erros (KKK) : (

1 ERRO. EBADCSRFTOKEN
Para corrigirmos esse erro, ir ao arquivo config/shield.js e alterar a opção
enable: true para false. Ficando desta forma:

 csrf: {
    enable: false,
    methods: ['POST', 'PUT', 'DELETE'],
    filterUris: [],
    cookieOptions: {
      httpOnly: false,
      sameSite: true,
      path: '/',
      maxAge: 7200
    }
  }

2 ERRO. HttpException

E_GUEST_ONLY: Only guest 
user can access the route
POST /login

Esse erro acontece devio à senha incorreta.


3 ERRO: RuntimeException

RuntimeException E_RUNTIME_ERROR: Session store is not initiated yet.
Make sure that you have included the session middleware
inside the list of global middleware.
More details: https://err.sh/adonisjs/errors/E_RUNTIME_ERROR

Esse erro é causado porque deve se colocar o Session no Global Middleware Desta forma:

const globalMiddleware = [
  'Adonis/Middleware/BodyParser',
  'Adonis/Middleware/Session' /*Aqui*/,
  'Adonis/Middleware/AuthInit',
  'App/Middleware/ConvertEmptyStringsToNull'
]

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published