지난 글에서 세팅한 firebase sdk를 사용해서 클라이언트에서 받은 idToken을 검증해보려고 한다.
우선 클라이언트에서 백엔드로 토큰을 보내는 방법은 여러가지가 있겠지만, HTTP 헤더에 토큰을 포함시키는 Bearer Authentication 방법을 사용하였다.
let idToken = null;
if (
req.headers.authorization &&
req.headers.authorization.startsWith("Bearer ")
) {
// get token from header
idToken = req.headers.authorization.split("Bearer ")[1];
}
const { admin } = require("../config/firebase");
admin
.auth()
.verifyIdToken(idToken)
.then((decodedIdToken) => {
console.log(decodedIdToken);
})
검증 결과는 아래와 같이 나타난다.
따라서 firebase의 uid가 필요한 경우, decodedIdToken.user_id
로 조회할 수 있다.
토큰이 유효하지 않으면 error로 이어지고, error.code
로 조회하면 결과를 볼 수 있다.
auth/id-token-expired
: 유효시간이 지난 토큰auth/argument-error
: 유효하지 않은 토큰전체 코드는 아래와 같다. 편의를 위해 미들웨어로 선언하였고, 필요한 api에서 가져다 쓰면 된다.
const { admin } = require("../config/firebase");
/**
* 미들웨어 - 인증이 필요한 api 앞단에서 클라이언트의 토큰 유효성 검사 (firebase)
*/
async function authFirebase(req, res, next) {
let idToken = null;
if (
req.headers.authorization &&
req.headers.authorization.startsWith("Bearer ")
) {
// get token from header
idToken = req.headers.authorization.split("Bearer ")[1];
} else {
// token not found
res.status(401).send({
code: -1,
message: "can't find token",
});
return;
}
// verify token
admin
.auth()
.verifyIdToken(idToken)
.then((decodedIdToken) => {
res.locals.userId = decodedIdToken.user_id;
res.locals.email = decodedIdToken.email;
next(); // 다음 미들웨어로
})
.catch((error) => {
console.log(error.code);
res.status(401);
switch (error.code) {
// expired token
case "auth/id-token-expired":
// error handling
break;
// invalid token
case "auth/argument-error":
// error handling
break;
}
});
}