GitHub OAuth란?
GitHub OAuth는OAuth 2.0 프로토콜을 기반으로사용자를 인증하고
GitHub API에 접근할 수 있도록Access Token을발급받는 방식
OAuth Apps에서 New OAuth App 클릭 후 정보 입력:

Application name
Homepage URL
Authorization callback URL

GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
GITHUB_CALLBACK_URL=http://localhost:5000/auth/github/callback
JWT_SECRET_KEY=your_jwt_secret_keyconst redirectToGitHub = (req: Request, res: Response) => {
const redirectURI = `https://github.com/login/oauth/authorize?client_id=${GITHUB_CLIENT_ID}
&redirect_uri=${GITHUB_CALLBACK_URL}&scope=user:email`;
res.redirect(redirectURI);
};
GitHub 로그인 완료 후, GitHub는 Authorization Code를 서버로 전달.
서버는 이 코드를 사용해 Access Token을 요청.
Access Token 요청 로직
export const handleGitHubCallback = async (
req: Request,
res: Response
): Promise<void> => {
const code = req.query.code as string;
if (!code) {
res.status(400).json({ error: 'Authorization code is missing' });
return;
}
try {
console.log('Access Token 요청');
//
const tokenResponse = await axios.post(
'https://github.com/login/oauth/access_token',
{
client_id: GITHUB_CLIENT_ID,
client_secret: GITHUB_CLIENT_SECRET,
code,
},
{ headers: { Accept: 'application/json' } }
);
const accessToken = tokenResponse.data.access_token;
if (!accessToken) {
throw new Error('Failed to obtain access token');
}
if (!userInfo.email) {
throw new Error('Primary email not found');
}
//JWT 생성
const token = jwt.sign(userInfo, JWT_SECRET_KEY!, { expiresIn: '1h' });
//성공적으로 로그인 처리
res.status(200).json({
message: 'GitHub 로그인 성공',
token,
user: userInfo,
});
} catch (error) {
console.error('GitHub OAuth Error:', error);
res.status(500).json({ error: 'GitHub OAuth Failed' });
}
};
Access Token을 사용해 GitHub API를 호출하고 사용자 정보를 가져옴.const userResponse = await axios.get("https://api.github.com/user", {
headers: { Authorization: `Bearer ${accessToken}` },
});
const userEmailResponse = await axios.get("https://api.github.com/user/emails", {
headers: { Authorization: `Bearer ${accessToken}` },
});
const userInfo = {
id: userResponse.data.id,
username: userResponse.data.login,
email: userEmailResponse.data.find((email: any) => email.primary)?.email,
};JWT를 생성하여 클라이언트에 전달.const token = jwt.sign(userInfo, JWT_SECRET!, { expiresIn: "1h" });
res.status(200).json({
message: "GitHub 로그인 성공",
token,
user: userInfo,
});
app.use('/auth', authRoutes);
router.get('/github', redirectToGitHub);
GET
http://localhost:5000/auth/github


{
"message":"GitHub 로그인 성공",
"token":"eyJhbGciOiJIUzI1Ni.......",
"user":{
"id":75677589,"username":"vedivero","email":"vedivero73@gmail.com"
}
}