어제 OAuth 이론에 이어 오늘은 Node.js 서버에 작성하여 올려보았다.
async oAuthLogin(code) {
// OAuth 액세스토큰 취득
const gitAccessToken = await this.getAccessToken(code);
// 액세스토큰으로 사용자 정보 취득
const userData = await this.getGitData(gitAccessToken);
// 사용자 정보로 DB 조회 (없으면 생성)
const isExistUser = await this.authRepository.getUserById(userData.login);
let { username, nickname, profile_image } = isExistUser;
if (!isExistUser) {
await this.authRepository.createUser(userData);
username = userData.login;
nickname = userData.name;
profile_image = userData.avatar_url;
}
// JWT 토큰 생성
const accessToken = await this.tokenManager.createAccessToken(userData.login);
const refreshToken = await this.tokenManager.createRefreshToken(userData.login);
if (!accessToken || !refreshToken) {
console.log(accessToken, refreshToken);
throw new CustomErr(ERR_CODES.INTERNAL_SERVER_ERROR, 'Error creating token');
}
return {
accessToken,
refreshToken,
username,
nickname,
profile_image,
};
}
async getAccessToken(code) {
// OAuth 액세스토큰 취득 로직
const response = await fetch(url.git.accessToken, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
client_id: config.git.client_id,
client_secret: config.git.client_secret,
code,
}),
});
if (!response.ok) {
// 에러 처리
logger.error(`Error getting git access token : ${response.status}`);
throw new CustomErr(ERR_CODES.INTERNAL_SERVER_ERROR, 'Error getting git access token');
}
const data = await response.text();
const accessToken = new URLSearchParams(data).get('access_token');
return accessToken;
}
async getGitData(accessToken) {
// 사용자 정보 취득 로직
const response = await fetch(url.git.userData, {
method: 'GET',
headers: {
Authorization: `token ${accessToken}`,
'Content-Type': 'application/json',
},
});
if (!response.ok) {
// 에러 처리
logger.error(`Error getting git Data : ${response.status}`);
throw new CustomErr(ERR_CODES.INTERNAL_SERVER_ERROR, 'Error getting git Data');
}
const userData = await response.json();
return userData;
}
catch의 경우 컨트롤러에서 에러핸들러가 처리해주고 있기 때문에 따로 try-catch로 감싸지는 않았다.
위의 메서드들은 서비스레이어 클래스 일부이다.
깃 로그인 요청 후 리디렉션 되는 로직으로 반환이 잘 되는 것을 확인했다.