투케이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("")
})
// */

// ----------------------------------------------------------------------------------------------
 

[결과 출력]

 

 


반응형
Comments