Notice
Recent Posts
Recent Comments
Link
투케이2K
81. (NodeJs) [Mac Os] [OAuth] : 구글 계정 사용해 OAuth 인증 및 AccessToken , RefreshToken 요청 실시 - 토큰 요청 본문
NodeJs
81. (NodeJs) [Mac Os] [OAuth] : 구글 계정 사용해 OAuth 인증 및 AccessToken , RefreshToken 요청 실시 - 토큰 요청
투케이2K 2024. 1. 19. 11:10[개발 환경 설정]
개발 툴 : VS CODE
개발 언어 :NodeJs
[app.js : 소스 코드]
// ----------------------------------------------------------------------------------------------
// ---------------------------------------
// [모듈 추가]
// ---------------------------------------
const express = require('express')
const app = express()
// ---------------------------------------
// [모듈 추가]
// ---------------------------------------
app.set('view engine', 'ejs') // [Page] : [Render]
app.set('views', './views') // [Page] : [Render]
// ---------------------------------------
// [모듈 추가]
// ---------------------------------------
var bodyParser = require('body-parser'); // [body-parser 사용]
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
// ---------------------------------------
// [모듈 추가]
// ---------------------------------------
var axios = require('axios'); // [axios 사용]
// ---------------------------------------
// [전역 변수 선언]
// ---------------------------------------
const CLIENT_ID = "3935 .... ghtrjr.apps.googleusercontent.com";
const CLIENT_SECRET = "GOC ... tOXVb";
const AUTH_REDIRECT_URL = "http://localhost:3000/getOauth"; // [리다이렉트 주소 : 구글 사용자 인증 정보에 등록 필요]
// ---------------------------------------
// [토큰 요청 http 통신 모듈]
// ---------------------------------------
const getAccessToken = async (code) => {
try {
// [post query string]
const tokenApi = await axios.post(
`https://oauth2.googleapis.com/token?code=${code}&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&redirect_uri=${AUTH_REDIRECT_URL}&grant_type=authorization_code`
);
const accessToken = tokenApi.data.access_token;
console.log("")
console.log("==============================================================================")
console.log("[getAccessToken] :: [Response]")
console.log("--------------------------------------------------------------------------")
console.log(JSON.stringify(tokenApi.data))
console.log("==============================================================================")
console.log("")
return accessToken; // [액세스 토큰 반환]
} catch (err) {
return err;
}
};
// ----------------------------------------------------------------------------------------------
// [Get] : Path = [/login] : http://localhost:3000/login
app.get('/login', function (req, res) {
console.log("")
console.log("==============================================================================")
console.log("[Server] :: [App] :: [Path = /login] :: [Start]")
console.log("--------------------------------------------------------------------------")
console.log("[INPUT] :: [Headers] :: " + JSON.stringify(req.headers))
console.log("--------------------------------------------------------------------------")
console.log("[INPUT] :: [Cookies] :: " + JSON.stringify(req.cookies))
console.log("--------------------------------------------------------------------------")
console.log("[INPUT] :: [Query] :: " + JSON.stringify(req.query))
console.log("--------------------------------------------------------------------------")
console.log("[INPUT] :: [Body] :: " + JSON.stringify(req.body))
console.log("==============================================================================")
console.log("")
try {
// [url 생성]
let url = 'https://accounts.google.com/o/oauth2/v2/auth/userinfo.email';
// [파라미터 추가]
//*
url += `?client_id=${CLIENT_ID}`; // [구글 클라이언트 아이디]
url += `&redirect_uri=${AUTH_REDIRECT_URL}`; // [리다이렉트 주소 : 구글 사용자 인증 정보에 등록 필요]
url += "&response_type=code"; // [response_type]
url += "&scope=email profile"; // [구글에 등록된 유저 정보 email, profile을 가져온다]
url += "&access_type=offline"; // [액세스 타입 - refresh token 취득]
// */
// [리다이렉트 수행]
res.redirect(url);
}
catch (err) {
res.status(500).send(JSON.stringify({"error" : err})); // [http 반환]
}
})
// ----------------------------------------------------------------------------------------------
// [Get] : Path = [/getOauth] : http://localhost:3000/getOauth
app.get('/getOauth', function (req, res) {
console.log("")
console.log("==============================================================================")
console.log("[Server] :: [Get] :: [Path = /getOauth] :: [Start]")
console.log("--------------------------------------------------------------------------")
console.log("[INPUT] :: [Headers] :: " + JSON.stringify(req.headers))
console.log("--------------------------------------------------------------------------")
console.log("[INPUT] :: [Cookies] :: " + JSON.stringify(req.cookies))
console.log("--------------------------------------------------------------------------")
console.log("[INPUT] :: [Params] :: " + JSON.stringify(req.query))
console.log("--------------------------------------------------------------------------")
console.log("[INPUT] :: [Body] :: " + JSON.stringify(req.body))
console.log("==============================================================================")
console.log("")
// [파라미터값 체크]
if (req.query != undefined && req.query != ""){
const { code } = req.query; // [OAuth 인증 코드 확인]
if (code != undefined && code != ""){ // [널 값이 아닌 경우]
// ---------------------------------------
// [Access Token 및 Refresh Token Http 요청]
// ---------------------------------------
getAccessToken(code);
}
res.send("");
}
else {
res.status(403).json({ "result" : "error" }); // [http 반환]
}
})
// ----------------------------------------------------------------------------------------------
// [Server] : [Start]
//*
app.listen(3000, function () {
console.log("")
console.log("==============================================================================")
console.log("[Server] :: [Port = 3000] :: [Start]")
console.log("==============================================================================")
console.log("")
})
// */
// ----------------------------------------------------------------------------------------------
[결과 출력]
반응형
'NodeJs' 카테고리의 다른 글
Comments