Feature #181
Updated by Chakkaphon Noinang (Jay) 13 days ago
* [x] 5002 = jobpost
* [x] 5003 = candidates
* [x] 5006 = jobapplication
* [ ] 5012 = notification
* [ ] xxxx = jobpost-consumer
# สร้างไฟล์ src/shared/utils/jwt.util.ts
```javascript
export function decodeJwt<T = unknown>(token: string): T {
const parts = token.split(".");
if (parts.length !== 3) {
throw new Error("Invalid JWT format");
}
const payload = parts[1];
const decoded = Buffer.from(
payload.replace(/-/g, "+").replace(/_/g, "/"),
"base64",
).toString("utf-8");
return JSON.parse(decoded) as T;
}
```
# แก้ไฟล์ auth-context.decorator.ts
```javascript
import {
createParamDecorator,
ExecutionContext,
UnauthorizedException,
} from "@nestjs/common";
import type { Request } from "express";
import type { JWTPayload } from "@shared/auth/jwt-payload.interface";
import { decodeJwt } from "@shared/utils/jwt.util";
export interface AuthContext {
userId: string;
userName: string;
group: string[];
}
export const ExtractAuthContext = createParamDecorator(
(data: unknown, ctx: ExecutionContext): AuthContext => {
const request = ctx.switchToHttp().getRequest<Request>();
// Extract token from Authorization header
const authHeader = request.headers.authorization;
if (!authHeader) {
throw new UnauthorizedException("Authorization header is required");
}
const token = authHeader.replace("Bearer ", "").trim();
if (!token) {
throw new UnauthorizedException("Token is required");
}
const jwtPayload = decodeJwt<JWTPayload>(token);
if (!jwtPayload.sid || !jwtPayload.name || !jwtPayload.group) {
throw new UnauthorizedException("User detail not correct");
}
// Return auth context
return {
userId: jwtPayload.sid,
userName: jwtPayload.name,
group: jwtPayload.group,
};
},
);
```
# แก้ไฟล์ src/shared/auth/jwt-payload.interface.ts
```javascript
export interface JWTPayload {
sid: string;
name: string;
group: string[];
}
```
# วิธีใช้ pass value ตั้งแต่ controller เข้าไป
```javascript
@ExtractAuthContext() authContext: AuthContext
```