*nodebird-api에서 api를 제공하는 서버를 만들었다. 이번 nodecat 프로젝트는 api를 사용하는 서비스를 구현한다.
*nodecat은 다른 서버에 요청을 보내므로 클라이언트 역할을 수행한다. api 제공자가 아닌 api를 사용하는 사용자 입장으로 nodebird의 db를 목적으로 사용한다. nodecat은 2차 가공자 서비스이다.
1.nodecat 설계
*API를 사용할려면 사용자 인증을 받아야한다. 그 후, NodeBird의 DB를 사용하여 서비스를 런칭한다.
//.env : clientSecret인 API 비밀키를 넣는다.
COOKIE_SECRET=cookie_secret
CLIENT_SECRET=306b898f-01e6-4032-a097-ce5a7df24b4c
//routers/index.js
const express=require('express')
const axios=require('axios')
const router=express.Router()
const URL='http://localhost:8002/v2'
axios.defaults.headers.origin = 'http://localhost:4000' //origin 헤더 추가
const request = async (req,api) => {
try {
if (!req.session.jwt) { // 세션에 토큰 없으면(사용자 JWT 토큰)
const tokenResult = await axios.post(`${URL}/token`,{
clientSecret:process.env.CLIENT_SECRET
})
req.session.jwt=tokenResult.data.token //세션에 토큰 저장
}
// 토큰이 존재하면 서버에서 원하는 API 불러와서 출력하기
return await axios.get(`${URL}${api}`,{
headers:{authorization:req.session.jwt}
}) //api 요청
} catch (error) {
if (error){
delete req.status.jwt
return request(req,api)
}
console.error(error)
next(error)
}
}
router.get('/',(req,res)=>{
res.render('main',{key:process.env.CLIENT_SECRET})
})
router.get('/mypost',async(req,res,next)=>{
try {
// 토큰의 존재여부 및 원하는 API 정보 읽어들이기
const result=await request(req,'/posts/my')
res.json(result.data)
} catch (error) {
console.error(error)
next(error)
}
})
router.get('/search/:hashtag', async (req,res,next)=>{
try {
// 토큰의 존재여부 및 원하는 API 정보 읽어들이기
const result = await request(
req,`/posts/hashtag/${encodeURIComponent(req.params.hashtag)}`,
)
res.json(result.data)
} catch (error) {
if (error.code) {
console.error(error)
next(error)
}
}
})
//토큰 테스트 라우터
router.get('/test',async(req,res,next)=>{ //토큰 테스트 라우터
try {
if (!req.session.jwt) { //세션에 토큰이 없으면 토큰 발급 시도
const tokenResult=await axios.post('http://localhost:8002/v1/token',{
clientSecret:process.env.CLIENT_SECRET
})
if (tokenResult.data && tokenResult.data.code === 200){ //토큰 발급 성공
req.session.jwt=tokenResult.data.token //세션에 토큰 저장
} else { //토큰 발급 실패
return res.json(tokenResult.data) //발급 실패 사유 응답
}
}
// 발급 받은 토큰 테스트
const result=await axios.get('http://localhost:8002/v1/test',{
headers:{authorization:req.session.jwt}
})
return res.json(result.data)
} catch (error) {
console.error(error)
if (error.response.status === 419){
return res.json(error.response.data)
}
return next(error)
}
})
module.exports=router
1.const request : NodeBird-api 서버에 req,api를 요청하고 원하는 API 불러오기
-req.session.jwt:사용자의 JWT 토큰이 저장되는 값이다. 토큰이 발급되면 해당 value가 존재한다.
-토큰이 존재하지 않으면 axios.post('http://localhost:8002/token')으로 요청을 보내 토큰을 발급받는다. 이때, 토큰 발급시 사용자 도메인(비밀키)가 필요하므로 req.body에 clientSecret을 저장해서 보낸다.
-다시 req.session.jwt에 방금 발급 받은 tokenResult.data.token을 저장한다.
-return 값으로 도메인과 토큰 모두 존재하므로 원하는 API를 불러온다. axios.get을 사용하여 NodeBird-api에 정보를 요청하고 req.headers에 토큰을 실어 보낸다.
get('/test')
1.API 비밀키를 사용하여 JWT 토큰을 발급
-req.session.jwt의 불값을 통해 JWT 토큰의 발급 유무를 확인한다. false면 nodebird-api 서버로 요청을 보내 JWT 토큰을 발급받는다. 이후, tokenResult.data를 통해 토큰 발급 성공 유무를 확인한다.
2.API 비밀키를 사용하여 발급받은 JWT 토큰 테스트
-headers에 authorization인 JWT 토큰을 넣어 res에 응답한다. 응답 실패시 catch 구문으로 넘어가 에러를 처리한다.
'개인 공부 > project - NodeBird' 카테고리의 다른 글
도메인 검증 후 JWT 토큰 발급/JWT 토큰 기반으로 API 제공 - nodebird-api (0) | 2023.06.26 |
---|