Firebase 토큰이 필요한 API를 테스트하는 방법

문제



백엔드 API를 개발 중이고 Firebase 토큰으로 API를 보호하고 있다고 가정해 보겠습니다. Firebase Auth SDK가 동일한 이유로 백엔드뿐만 아니라 토큰 생성, 새로고침 등을 위한 모든 힘든 작업을 수행하기 때문에 프런트엔드(모바일 또는 웹)에서 많은 개발 시간을 절약할 수 있습니다. 그러나 Postman 또는 다른 REST 클라이언트로 이 API를 테스트하려는 경우 문제에 직면할 수 있습니다. 클라이언트가 Firebase SDK에서 받는 것과 동일한 토큰을 얻는 방법은 무엇입니까?

이를 수행하는 방법 중 하나는 클라이언트 앱을 시작하고 거기에서 토큰을 가져오는 것입니다. 개인적으로 저는 이 작업에 많은 시간을 낭비했습니다.

더 나은 솔루션



그것을 하기 위한 더 나은 방법이 있고 나는 그것이 얼마나 쉬운지에 놀랐다. 우리가 해야 할 일은 Firebase Auth REST API( https://firebase.google.com/docs/reference/rest/auth )를 사용하는 것뿐입니다. Firebase 사용자와 토큰을 관리하는 데 사용할 수 있는 간단한 API 호출을 제공합니다.

예시



어떻게 할 수 있는지 예를 들어 보겠습니다. 저는 샘플 Firebase 프로젝트를 만들고 간단한 클라우드 기능을 배포했습니다.

const functions = require("firebase-functions");
const serviceAccount = require("./service-account.json");
const { initializeApp, cert } = require('firebase-admin/app');
const { getAuth } = require('firebase-admin/auth');

const app = initializeApp({
    credential: cert(serviceAccount)
})
const auth = getAuth(app)

exports.protectedEndpoint = functions.https.onRequest(async (request, response) => {
    try {
        const xApiToken = request.headers['x-api-token']
        const decodedToken = await auth.verifyIdToken(xApiToken)
        response.send({ decodedToken });
    } catch (ex) {
        response.status(403).json({
            error: "'x-api-token' header is required!"
        })
    }
});


cURL을 통해 호출해 보겠습니다.

➜  ~ curl https://us-central1-givemefirebasetoken-sample.cloudfunctions.net/protectedEndpoint
{"error":"'x-api-token' header is required!"}%


예상대로 auth.verifyIdToken()가 실패했기 때문에 오류가 발생했습니다.

이제 Rest API를 통해 토큰을 가져와 봅시다. 가장 먼저 필요한 것은 Firebase 프로젝트용 API_KEY입니다. 가장 쉬운 방법은 Firebase 콘솔에서 웹 앱을 만드는 것입니다. 다음으로 API_KEY가 표시됩니다. 다음은 내 샘플 프로젝트의 예입니다.


apiKey가 있으면 firebase에 대한 호출을 시작할 수 있습니다. 자세한 API 참조: https://firebase.google.com/docs/reference/rest/auth에 대한 링크입니다.

저는 개인적으로 3가지 방법을 사용합니다.
  • 이메일/비밀번호로 회원가입 ( https://firebase.google.com/docs/reference/rest/auth#section-create-email-password )
  • 이메일/비밀번호로 로그인( https://firebase.google.com/docs/reference/rest/auth#section-sign-in-email-password )
  • 계정 삭제( https://firebase.google.com/docs/reference/rest/auth#section-delete-account )
  • Delete는 매번 새 사용자를 생성하려는 경우 유용하며 자동 테스트에서 사용할 수 있습니다. 따라서 우리의 흐름은 다음과 같습니다.
  • 이메일/비밀번호로 가입하세요.
  • API 테스트를 실행합니다.
  • 사용자를 삭제합니다.

  • 좋습니다. API 요청으로 새 사용자를 생성해 보겠습니다.

    curl --location --request POST 'https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=AIzaSyAHV1eUu8EqCSUeycofXqfL******' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "email": "[email protected]",
        "password": "******",
        "returnSecureToken": true
    }'
    


    응답은 다음과 같아야 합니다.

    {
      "kind": "identitytoolkit#SignupNewUserResponse",
      "idToken": "eyJhbGciOiJSUzI1NiIsImtpZ....gkULJig1ypXaA",
      "email": "[email protected]",
      "refreshToken": "AIwUaOkfNuMg8Kdatx-Hy8_5Ti0sm....-dKiN0CGkDfX1ch5f69g5Y5K",
      "expiresIn": "3600",
      "localId": "aoiC7bM0v....ueGMRegf1k2"
    }
    

    idToken는 Firebase 인증 SDK에서 받는 것과 정확히 동일한 토큰입니다.
    localId는 새 사용자 ID입니다.
    Email/Password 설정에서 Authentication 인증 공급자를 활성화해야 한다는 점을 기억하십시오.



    이제 idToken 샘플 호출을 다시 실행해 보겠습니다.

    curl --location --request GET 'https://us-central1-givemefirebasetoken-sample.cloudfunctions.net/protectedEndpoint' \
    --header 'x-api-token: eyJhbGciOiJSUzI1NiIsImtpZ....09HlrF49MRWo9qq0_c6UiMHdBZUavNXyuFyjC85dpSxJrNtJSwH5OQa22dIwdbNmfMqz6ljAivIkjw5aX2GrF5ViFCdp4Tew5iw'
    


    응답으로 decodedToken를 얻었습니다.

    {"decodedToken":{"iss":"https://securetoken.google.com/givemefirebasetoken-sample","aud":"givemefirebasetoken-sample","auth_time":1651977397,"user_id":"aoiC7bM0vFQTMPj24ueGMRegf1k2","sub":"aoiC7bM0vFQTMPj24ueGMRegf1k2","iat":1651977397,"exp":1651980997,"email":"[email protected]","email_verified":false,"firebase":{"identities":{"email":["[email protected]"]},"sign_in_provider":"password"},"uid":"aoiC7bM0vFQTMPj24ueGMRegf1k2"}}
    


    Postman 환경 활용



    이제 사용자 정보를 얻기 위해 실행해야 하는 API 호출을 알았습니다. Postman 변수 및 환경(https://learning.postman.com/docs/sending-requests/variables/)을 활용하여 토큰을 저장하고 자체 백엔드 API 호출과 함께 사용하겠습니다.

    먼저 필요한 env 및 설정 변수를 생성해 보겠습니다.



    변수는 꽤 자명합니다.)

    이제 accounts:signUp 요청을 생성하고 실행해 보겠습니다.



    이제 토큰을 받으면 Tests 탭( https://learning.postman.com/docs/writing-scripts/test-scripts/ )을 사용하여 환경에 토큰을 저장해 보겠습니다.

    var jsonData = JSON.parse(responseBody);
    pm.expect(jsonData.idToken).to.be.a('string');
    postman.setEnvironmentVariable("firebaseIdToken", jsonData.idToken);
    


    두 번째 줄에서 idToken가 있고 문자열인지 확인합니다. 이는 요청이 실패한 경우 잘못된firebaseIdToken env var 설정을 방지하기 위해 필요합니다. accounts:signUp 요청을 두 번 호출했는데 Firebase에서 사용자가 이미 존재한다는 오류가 발생했다고 가정해 보겠습니다.

    이제 실행 후 환경에 토큰이 있고 자체 API 호출에서 사용할 수 있습니다.



    자동 토큰 검색



    Postman에는 pre-request scripts:https://learning.postman.com/docs/writing-scripts/pre-request-scripts/라는 멋진 기능이 있습니다.

    이를 사용하여 토큰 검색 및 환경 설정을 자동화할 수 있으며 가장 좋은 점은 전체 컬렉션에 대한 사전 요청 스크립트를 만들 수 있다는 것입니다! 즉, Firebase 요청을 수동으로 호출할 필요가 없습니다.

    다음은 예제 스크립트입니다.

    const firebaseApiKey = pm.environment.get("firebaseApiKey")
    const firebaseTestUserEmail = pm.environment.get("firebaseTestUserEmail")
    const firebaseTestUserPassword = pm.environment.get("firebaseTestUserPassword")
    
    const options = {
        url: `https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=${firebaseApiKey}`,
        method: 'POST',
        header: {
            'Accept': '*/*',
            'Content-Type': 'application/json',
        },
        body: {
            mode: 'raw',
            raw: JSON.stringify({
                "email": firebaseTestUserEmail,
                "password": firebaseTestUserPassword,
                "returnSecureToken": true
            })
        }
    };
    
    pm.sendRequest(options, function (err, res) {
        const respData = res.json();
    
        pm.environment.set("firebaseIdToken", respData.idToken);
        pm.environment.set("firebaseUID", respData.localId);
    });
    

    좋은 웹페이지 즐겨찾기