Ở bài trước chúng ta đã biết cách gen token để xác thực người dùng, bài viết này mình sẽ hướng dẫn sử dụng cái token đó cho phiên làm việc.
Đầu tiên chúng ta sẽ tạo package middleware để dành riêng cho tác vụ xử lý middleware(nếu các bạn chưa biết middleware là gì thì hãy search gg khoảng 3-5 phút là có thể hiểu đương sơ sơ khái niệm về nó)
middleware/middlewareJWT.ts:
exportconstjwtMiddleware=async(context: Context, next: any)=>{}
đầu tiên chúng ta cần 1 function làm nhiệm vụ đó, tiếp theo chúng ta sẽ lấy ra headers của request người dùng :
const header: Headers = context.request.headers;
sau đó thêm 1 vài tiểu tiết để hoàn thiện code thôi :Đ
if(!author){returnResponseCustom(context, Status.Unauthorized,{
message:"Invalid JWT Token",});}const token = author.split(" ")[1];if(token){if(awaitverify(token, keyHS256)){awaitnext();return;}}else{returnResponseCustom(context, Status.Unauthorized,{
message:"Invalid JWT Token",});}
đoạn code hoàn chỉnh :
import{validate, verify}from"https://deno.land/x/[email protected]/mod.ts";import{Context, Status}from"https://deno.land/x/[email protected]/mod.ts";import{ResponseCustom}from"../utilities/responseCustom.ts";import{keyHS256}from"../secure/token.ts";exportconstjwtMiddleware=async(context: Context, next: any)=>{const header: Headers = context.request.headers;// đầu tiên chúng ta bóc tách header để lấy tokenconst author = header.get("Authorization");if(!author){returnResponseCustom(context, Status.Unauthorized,{
message:"Invalid JWT Token",});}// vd : Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibm// thì token sẽ là eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmconst token = author.split(" ")[1];if(token){// việc đơn giản chúng ta get cái token này và verify nó với keyHS256 mà chúng ta đã tạo trước đó,// nếu verify được thì next() : cho thực hiện bước tiếp theoif(awaitverify(token, keyHS256)){awaitnext();return;}}else{returnResponseCustom(context, Status.Unauthorized,{
message:"Invalid JWT Token",});}}
- cách sử dụng middleware cũng rất đơn giản, chúng ta hãy thêm middleware vừa viết vào trước
helloHandler
xem sao nhé :
router
.get("/", jwtMiddleware, helloHandler).post("/api/v1/sign-up", signUpHandler).post("/api/v1/sign-in", signInHandler);
Nếu get theo như bài 1, chúng ta sẽ bị lỗi như sau :
{"message":"Invalid JWT Token"}
- Nếu muốn qua được lớp “hàng rào” này, chúng ta cần dùng token nào đó, hay thử sign-in lại và lấy token nhận được, thêm vào Authorization->Type(Bearer Token), kết quả sẽ được như sau :
Hello world
- Khá đơn giản phải không nào, nhưng như chúng ta biết, muốn xem thông tin người dùng từ cái token đó chúng ta cần phải trải qua các công đoạn : parse token (thuật ngữ này mình cũng k rõ là đúng hay ko, nếu sai mn góp ý nhé) đó ra, vì token đó mang thông tin user, ở các bài trước mình có sử dụng
{phone: reqValue.numberPhone, userName: reqValue.userName}
để gen ra token, vậy khi mình parse token đó, chúng ta sẽ nhận được những thông tin y đúc như vậy - Đâu tiên, chúng ta cần thêm vài function bóc tách và decode cái token mà nhận được ở headers:
middleware/middlewareJWT.ts:
ở file này, thêm vào đoạn code dùng để lấy thông tin từ token
exportconstparseToken=async(context: Context)=>{const token =awaitgetToken(context);const data =decode(token);// hàm decode sẽ trả về dạng [header: unknown, payload: unknown, signature: Uint8Array], link tại https://deno.land/x/[email protected]/mod.ts#L73 , trong đó payload là thông tin// mà chúng ta thu đượcreturn data ? data[1]:null;}constgetToken=async(context: Context)=>{const header: Headers = context.request.headers;const author = header.get("Authorization");if(author){const token = author.split(" ")[1];if(token){return token;}}return"";}
controllers/userController.ts:
exportconstuserProfileHandler=async(context : Context)=>{const dataUser =awaitparseToken(context);if(!dataUser){return;}const userName =(dataUser as any).userName;const user =awaitgetByUserName(userName);if(user){returnResponseCustom(context, Status.OK,{
status: Status.OK,
message:STATUS_TEXT.get(Status.OK),
data : user
});}else{returnResponseCustom(context, Status.NotFound,{
status: Status.NotFound,
message:STATUS_TEXT.get(Status.NotFound)});}}
Doạn này thì đơn giản rồi, chúng ta sẽ lấy userName từ token, và dùng hàm
getByUserName()
ở userRepository.ts để lấy ra thông tin user có userName từ token, nếu k tìm thấy user nào thỏa màn thì trả về NotFound thôi
- Đến đây thì chúng ta đã biết cách sử dụng middleware như 1 “rào chắn” trong api. Bài tiếp theo mình sẽ dần dần hoàn thành cách api như : lấy thông tin sản phẩm, order,…
Nguồn: viblo.asia