Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,32 @@ Aşağıdaki görevleri tamamlamak ve uygulamanın tüm testleri geçmesi için

Erişim fonksiyonlarını `api/users/users-model.js` dosyasına yazacaksınız:

- [ ] `bul`
- [ ] `goreBul`
- [ ] `idyeGoreBul`
- [x] `bul`
- [x] `goreBul`
- [x] `idyeGoreBul`

#### 2B - Middleware Fonksiyonları

Auth middlewarelarını `api/auth/auth-middleware.js` dosyasına yazacaksınız:

- [ ] `sinirli`
- [ ] `sadece`
- [ ] `usernameVarmi`
- [ ] `rolAdiGecerlimi`
- [x] `sinirli`
- [x] `sadece`
- [x] `usernameVarmi`
- [x] `rolAdiGecerlimi`

#### 2C - Uçnoktalar

Kimlik doğrulama, JSON Web Tokenler kullanılarak uygulanacaktır.

Aşağıdaki uçnoktaları `api/auth/auth-router.js` dosyasına yazın:

- [ ] `[POST] /api/auth/register`
- [ ] `[POST] /api/auth/login`
- [x] `[POST] /api/auth/register`
- [x] `[POST] /api/auth/login`

`api/users/users-router.js` içindeki uçnoktalar hazır ama yine de bir göz atın:

- [ ] `[GET] /api/users` - sadece geçerli tokena sahip olan kullanıcılar erişebilir
- [ ] `[GET] /api/users/:user_id` - sadece geçerli tokena sahip olan kullanıcılar ve rolü admin olan kullanıcılar erişebilir
- [x] `[GET] /api/users` - sadece geçerli tokena sahip olan kullanıcılar erişebilir
- [x] `[GET] /api/users/:user_id` - sadece geçerli tokena sahip olan kullanıcılar ve rolü admin olan kullanıcılar erişebilir

#### 2D - Secret Dosyaları

Expand Down
83 changes: 70 additions & 13 deletions api/auth/auth-middleware.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { JWT_SECRET } = require("../secrets"); // bu secreti kullanın!

const jwt = require("jsonwebtoken");
const { JWT_SECRET } = require("../secrets/index"); // bu secreti kullanın!
const User = require("../users/users-model");
const sinirli = (req, res, next) => {
/*
Eğer Authorization header'ında bir token sağlanmamışsa:
Expand All @@ -16,11 +17,31 @@ const sinirli = (req, res, next) => {

Alt akıştaki middlewarelar için hayatı kolaylaştırmak için kodu çözülmüş tokeni req nesnesine koyun!
*/
}
const token = req.headers.authorization; //tokenı aldık
if (token) {
//token olmayabilir
//token var ve geçerli
jwt.verify(token, JWT_SECRET, (err, decodedJWT) => {
//verify 3 tane argüman alıyor token secret hata varsa err düşecek yoksa decodenJWT
if (err) {
//token var,geçersiz
next({
status: 401,
message: "token gecersizdir",
});
} else {
//token var geçerli
req.decodedJWT = decodedJWT;
next(); //kullanıcyı bir sonraki middleware gönderiyoruz
}
});
} else {
next({ status: 401, message: "token gereklidir" });
}
};

const sadece = role_name => (req, res, next) => {
const sadece = (role_name) => (req, res, next) => {
/*

Kullanıcı, Authorization headerında, kendi payloadu içinde bu fonksiyona bağımsız değişken olarak iletilen
rol_adı ile eşleşen bir role_name ile bir token sağlamazsa:
status: 403
Expand All @@ -30,21 +51,38 @@ const sadece = role_name => (req, res, next) => {

Tekrar authorize etmekten kaçınmak için kodu çözülmüş tokeni req nesnesinden çekin!
*/
}

if (req.decodedJWT && req.decodedJWT.role_name === role_name) {
next();
} else {
next({ status: 403, message: "Bu, senin için değil" });
}
};

const usernameVarmi = (req, res, next) => {
const usernameVarmi = async (req, res, next) => {
/*
req.body de verilen username veritabanında yoksa
status: 401
{
"message": "Geçersiz kriter"
}
*/
}

try {
const presentUser = await User.goreBul({
username: req.body.username,
});
if (!presentUser.length) {
//array döneceği için uzunluğu 0 olanı yani boş olanı için yazdık
next({ status: 401, message: "Geçersiz kriter" });
} else {
req.user = presentUser[0];
next();
}
} catch (error) {
next(error);
}
};

const rolAdiGecerlimi = (req, res, next) => {
const rolAdiGecerlimi = async (req, res, next) => {
/*
Bodydeki role_name geçerliyse, req.role_name öğesini trimleyin ve devam edin.

Expand All @@ -63,11 +101,30 @@ const rolAdiGecerlimi = (req, res, next) => {
"message": "rol adı 32 karakterden fazla olamaz"
}
*/
}
try {
const { role_name } = req.body;
if (!role_name || role_name.trim() === "") {
//role_name eksikse veya trimden sonra sadece boş bir string kaldıysa
req.role_name = "student";
next();
} else if (role_name.trim() === "admin") {
//Stringi trimledikten sonra kalan role_name 'admin' ise
next({ status: 422, message: "Rol adı admin olamaz" });
} else if (role_name.trim().length > 32) {
//Trimden sonra rol adı 32 karakterden fazlaysa
next({ status: 422, message: "rol adı 32 karakterden fazla olamaz" });
} else {
req.role_name = role_name.trim();
next();
}
} catch (error) {
next(error);
}
};

module.exports = {
sinirli,
usernameVarmi,
rolAdiGecerlimi,
sadece,
}
};
60 changes: 55 additions & 5 deletions api/auth/auth-router.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
const router = require("express").Router();
const { usernameVarmi, rolAdiGecerlimi } = require('./auth-middleware');
const { JWT_SECRET } = require("../secrets"); // bu secret'ı kullanın!
const { usernameVarmi, rolAdiGecerlimi } = require("./auth-middleware");
const { JWT_SECRET } = require("../secrets/index"); // bu secret'ı kullanın!
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const User = require("../users/users-model");

router.post("/register", rolAdiGecerlimi, (req, res, next) => {
router.post("/register", rolAdiGecerlimi, async (req, res, next) => {
/**
[POST] /api/auth/register { "username": "anna", "password": "1234", "role_name": "angel" }

Expand All @@ -14,10 +17,20 @@ router.post("/register", rolAdiGecerlimi, (req, res, next) => {
"role_name": "angel"
}
*/
try {
const hash = bcrypt.hashSync(req.body.password, 10);
const newUser = await User.ekle({
role_name: req.role_name,
username: req.body.username,
password: hash,
});
res.status(201).json(newUser);
} catch (error) {
next(error);
}
});


router.post("/login", usernameVarmi, (req, res, next) => {
router.post("/login", usernameVarmi, async (req, res, next) => {
/**
[POST] /api/auth/login { "username": "sue", "password": "1234" }

Expand All @@ -36,6 +49,43 @@ router.post("/login", usernameVarmi, (req, res, next) => {
"role_name": "admin" // giriş yapan kulanıcının role adı
}
*/
try {
const { password } = req.body;
const passwordControl = bcrypt.compareSync(password, req.user.password);
if (passwordControl) {
const token = jwt.sign(
{
subject: req.user.user_id, //sub
username: req.user.username,
role_name: req.user.role_name,
},
JWT_SECRET,
{ expiresIn: "1d" }
);
res
.status(200)
.json({ message: `${req.user.username} geri geldi`, token: token });
} else {
next({
status: 401,
message: "Geçersiz kriter",
});
}
} catch (error) {
next(error);
}
});

// function generatetoken(user) {
// const payload = {
// subject: req.user.user_id, //sub
// username: req.user.username,
// role_name: req.user.role,
// };
// const option = {
// expiresIn: "8h", //tokenın ne kadar zaman geçerli olacağını belirliyoruz
// };
// const token = jwt.sign(payload, JWT_SECRET, option); //payload secret option
// return token;
// }
module.exports = router;
5 changes: 3 additions & 2 deletions api/secrets/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
Eğer bunları sağlamazsanız Testler geçmez ve diğer yazılımcılar bu repoyu klonladıklarında
projeyi beklendiği gibi çalıştıramazlar.
*/
module.exports = {

}
module.exports = {
JWT_SECRET: process.env.JWT_SECRET || "shh",
};
47 changes: 34 additions & 13 deletions api/users/users-model.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const db = require('../../data/db-config.js');
const db = require("../../data/db-config.js");

function bul() {
/**
Expand All @@ -18,6 +18,11 @@ function bul() {
}
]
*/
// Select u.user_id,u.username,r.role_name from [users] as u
// left Join roles as r on r.role_id=u.role_id
return db("users as u")
.leftJoin("roles as r", "u.role_id", "r.role_id")
.select("u.user_id", "u.username", "r.role_name");
}

function goreBul(filtre) {
Expand All @@ -33,7 +38,13 @@ function goreBul(filtre) {
"role_name": "admin",
}
]
Select u.user_id,u.username,u.password,r.role_name from [users] as u
left Join roles as r on r.role_id=u.role_id
*/
return db("users as u")
.leftJoin("roles as r", "u.role_id", "r.role_id")
.select("u.user_id", "u.username", "u.password", "r.role_name")
.where(filtre);
}

function idyeGoreBul(user_id) {
Expand All @@ -47,6 +58,11 @@ function idyeGoreBul(user_id) {
"role_name": "instructor"
}
*/
return db("users as u")
.leftJoin("roles as r", "u.role_id", "r.role_id")
.select("u.user_id", "u.username", "r.role_name")
.where("user_id", user_id)
.first();
}

/**
Expand All @@ -67,21 +83,26 @@ function idyeGoreBul(user_id) {
"role_name": "team lead"
}
*/
async function ekle({ username, password, role_name }) { // bu kısım hazır
let created_user_id
await db.transaction(async trx => {
let role_id_to_use
const [role] = await trx('roles').where('role_name', role_name)
async function ekle({ username, password, role_name }) {
// bu kısım hazır
let created_user_id;
await db.transaction(async (trx) => {
let role_id_to_use;
const [role] = await trx("roles").where("role_name", role_name);
if (role) {
role_id_to_use = role.role_id
role_id_to_use = role.role_id;
} else {
const [role_id] = await trx('roles').insert({ role_name: role_name })
role_id_to_use = role_id
const [role_id] = await trx("roles").insert({ role_name: role_name });
role_id_to_use = role_id;
}
const [user_id] = await trx('users').insert({ username, password, role_id: role_id_to_use })
created_user_id = user_id
})
return idyeGoreBul(created_user_id)
const [user_id] = await trx("users").insert({
username,
password,
role_id: role_id_to_use,
});
created_user_id = user_id;
});
return idyeGoreBul(created_user_id);
}

module.exports = {
Expand Down
Binary file modified data/auth.db3
Binary file not shown.
Binary file modified data/testing.db3
Binary file not shown.
4 changes: 2 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const server = require('./api/server.js');

const server = require("./api/server.js");
require("dotenv").config();
const PORT = process.env.PORT || 9000;

server.listen(PORT, () => {
Expand Down
Loading