Skip to content
Merged
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
103 changes: 73 additions & 30 deletions middleware/authChecker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,38 +11,47 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio
const LoginType = req.headers.LoginType;
if (LoginType === 'email') {
// 로그인 방식 - email
jwt.verify(accessToken, process.env.ACCESS_SECRET as string, err => {
if (err) {
// 기간만료 ? 맞다.
// 그럼이제 리프레시토큰을 이용해서 액세스토큰 재발급
// 그럼 두가지 분기처리를 해야한다, 리프레시토큰이없거나,만료되었거나해서 리다이렉트 로그인페이지
// 다시 액세스토큰을 내려주거나
// res.status(401).json({ error: 'expired!' });
const refreshToken = req.cookies.refreshToken;
if (refreshToken) {
// refresh token 존재
jwt.verify(
refreshToken,
process.env.REFRESH_SECRET as string,
async (err: VerifyErrors | null, decoded: any | undefined) => {
if (err) {
// refresh token 정상적이지않음
res.redirect(`${process.env.CLIENT_URL}/Login`);
} else {
// 새로운 access token을 발급받음
const id = decoded.userId;
const email = decoded.email;
const newAccessToken = await accessTokenGenerator(id, email);
req.newAccessToken = newAccessToken;
}
},
);
jwt.verify(
accessToken,
process.env.ACCESS_SECRET as string,
(err: VerifyErrors | null, decoded: any | null) => {
if (err) {
// 기간만료 ? 맞다.
// 그럼이제 리프레시토큰을 이용해서 액세스토큰 재발급
// 그럼 두가지 분기처리를 해야한다, 리프레시토큰이없거나,만료되었거나해서 리다이렉트 로그인페이지
// 다시 액세스토큰을 내려주거나
// res.status(401).json({ error: 'expired!' });
const refreshToken = req.cookies.refreshToken;
if (refreshToken) {
// refresh token 존재
jwt.verify(
refreshToken,
process.env.REFRESH_SECRET as string,
async (err: VerifyErrors | null, decoded: any | undefined) => {
if (err) {
// refresh token 정상적이지않음
res.redirect(`${process.env.CLIENT_URL}/login`);
} else {
// 새로운 access token을 발급받음
const id = decoded.userId;
const email = decoded.email;
const newAccessToken = await accessTokenGenerator(id, email);
req.newAccessToken = newAccessToken;
req.user_email = email;
}
},
);
} else {
// refresh token 없음
res.redirect(`${process.env.CLIENT_URL}/login`);
}
} else {
// refresh token 없음
res.redirect(`${process.env.CLIENT_URL}/login`);
// access token 만료되지 않음
req.newAccessToken = accessToken;
req.user_email = decoded.email;
}
}
});
},
);
} else if (LoginType === 'google') {
// 로그인 방식 - google
// refresh token을 이용하여 새로운 access token을 발급받음
Expand All @@ -63,12 +72,46 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio
console.log(err.message);
res.redirect(`${process.env.CLIENT_URL}/login`);
});
// access token으로 유저 정보 가져오기
const googleInfoURL = 'https://www.googleapis.com/oauth2/v3/userinfo';
const resInfo = await axios
.get(googleInfoURL, {
headers: {
authorization: `Bearer ${accessToken}`,
},
})
.then(result => result.data.email)
.catch(err => {
// 에러 발생 -> 인증 불가 -> 다시 로그인해야함
console.log(err.message);
res.redirect(`${process.env.CLIENT_URL}/login`);
});
req.user_email = resInfo;
} else if (LoginType === 'github') {
// 로그인 방식 - github
// refresh token이 없음, 로그아웃 하기 전까지 access token 계속 사용 가능
req.newAccessToken = accessToken;
// access token으로 유저 정보 가져오기
const githubInfoURL = 'https://api.github.com/user';
const resInfo = await axios
.get(githubInfoURL, {
headers: {
authorization: `Bearer ${accessToken}`,
},
})
.then(result => {
console.log('result.data - ', result.data);
return result.data.login;
})
.catch(err => {
// 에러 발생 -> 인증 불가 -> 다시 로그인해야함
console.log(err.message);
res.redirect(`${process.env.CLIENT_URL}/login`);
});
req.user_email = `${resInfo}@github.com`;
}
// 실제 요청으로 넘어감
// req.user_email: 유저 이메일 정보 저장, 실제 요청에서 사용 가능
// 나중에 응답 보낼때 accessToken에 req.newAccessToken을 넣어주면 됨
next();
} else {
Expand Down
1 change: 1 addition & 0 deletions src/customType/express.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export declare global {
namespace Express {
interface Request {
newAccessToken?: string;
user_email?: string;
}
}
}