adonis new autenticacao-com-sessao --api-only
npm install sqlite3 --save
ou
yarn add sqlite3
Seguir este passo: (https://yarnpkg.com/en/package/sqlite3)
adonis migration:run
adonis make:controller Session --type http
- register - Cadastrará algum usuário
- login - Para fazer o login do usuário
- show - Mostra o usuário logado
- 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 {}
async register({ auth, request, response }) {
let user = await User.create(request.all());
return response.json(user);
}
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);
}
}
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" });
}
}
// 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'])
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.
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'
]