Página da disciplina de pos (Programação Orientada a Serviços) do curso técnico integrado de Informática para Internet.
npm install --global knex
pnpm add bcrypt @hapi/basic
pnpm run db-migrate-make users
pnpm run db-seed-make users
pnpm run dev-start
Adicione migrations/*_users.js
const table_name = "users";
exports.up = function(knex) {
return knex.schema.createTable(table_name, table => {
table.increments("oid").primary();
table.string("login").notNullable();
table.string("email").nullable();
table.string("name").nullable();
table.string("password").nullable();
table.timestamps(false, true);
});
};
exports.down = function(knex) {
return knex.schema.dropTable(table_name);
};
Adicione seeds/user.js
bcrypt = require("bcrypt");
const table_name = "users";
const salt = bcrypt.genSaltSync();
exports.seed = function(knex) {
return knex(table_name)
.del()
.then(function() {
return knex(table_name).insert([
{
login: "testador",
email: "testador@gmail.com",
name: "Testador fake",
password: bcrypt.hashSync("secret", salt)
},
{
login: "professor",
email: "professor@gmail.com",
name: "Professor fake",
password: bcrypt.hashSync("s3cr3t", salt)
},
{
login: "aluno",
email: "aluno@gmail.com",
name: "Aluno fake",
password: bcrypt.hashSync("53cr3t", salt)
}
]);
});
};
Execute
pnpm run db-migrate
pnpm run db-populate
Adicione ./src/models/users.js
import bcrypt from "bcrypt";
import knex from "../config/knex";
const table_name = "users";
class User {
static login(username, password) {
return knex(table_name)
.select()
.where("login", username)
.then(users => {
if (users.length == undefined || users.length == 0) return undefined;
if (bcrypt.compareSync(password, users[0].password)) return users[0];
return undefined;
});
}
}
export default User;
Adicione src/routes/users/auth.js
import { User } from "../../models";
export default {
method: ["GET", "POST"],
path: "/auth",
options: {
auth: "simple"
},
handler: (request, reply) => ({ msg: "logged" })
};
Modificado src/server.js
import Hapi from "@hapi/hapi";
import { User } from "./models";
const server = new Hapi.Server({
port: process.env.PORT || 8000,
debug: { request: ["*"] }
});
const validate = async (request, username, password) => {
const user = await User.login(username, password);
if (user == undefined) {
return { credentials: null, isValid: false };
}
return { credentials: { id: user.oid, username: user.login }, isValid: true };
};
const init = async () => {
await server.register([
{
plugin: require("@hapi/basic")
}
]);
server.auth.strategy("simple", "basic", { validate });
await server.register({
plugin: require("hapi-router"),
options: {
routes: "src/routes/**/*.js"
}
});
await server.start();
console.log("Server is running");
console.log(server.info);
};
init();