Tool

포스트맨(Postman) 에서 firebase login 정보 사용하기(Get Firebase Access Token in POSTMAN)

끄적a 2022. 1. 29. 00:41

몇 년 전까지는 단순하게 api만 확인할 수 있었던 포스트맨이 어느새 많이 발전이 돼서 여러 가지 기능을 지원하게 되었다. (여러 가지 기능을 지원하면서 구독의 영역으로....)

 

발전된 기능 중에 Script 기능을 활용하여 여러 가지 변수들을 api에 넣을 수 있게 되었다. 

예를 들어 현재 date 정보를 api에 넣는 경우 

var date = new Date(Date.now() - new Date().getTimezoneOffset() * 60000).toISOString().substr(0, 10);

위와 같이 date를 구하여 해당 변수를 api에 넣어 사용할 수 있다. 

기본적인 기능을 사용하는 방법은 아래 blog를 참고하면 좋다(정리를 정말 잘하셨음)

https://kellis.tistory.com/23

 

이 Script 기능을 이용하여 firebase에 로그인하고 로그인 정보를 이용하여 api를 호출 할 수 있다. 

https://stackoverflow.com/questions/49934701/get-firebase-access-token-in-postman

 

1. firebase api key 확인

파이어베이스 콘솔 > 프로젝트 설정 화면에 들어가면 아래 두곳에서 api키를 확인 할 수 있다. 

해당키를 저장해두자(아래는 테스트용으로 만든거라 공개한건데 공개하면 안된다)

 

2. Environments 변수 설정 

Environments 메뉴에 1번에서 구한 "api_key" 값을 추가한다. 

"auth_username","auth_password"도 firebase에 등록 되어 있는 걸 사용한다.

3. Script 작성 

Pre-request Script메뉴에 아래 코드를 넣는다. 

url은 임의의 값을 넣고 send를 누루면 firebase의 uid, token 값등을 얻어 사용 할 수 있다. 

''에는 Environments에 있는 변수 값들이다. (소스 설명은 소스에 주석 처리)

//1번에서 구한 api_key를 사용
const apiKey = pm.environment.get('api_key');

if ( ! apiKey) {
    return
}

// 반복 호출을 방지 하기 위한 코드 
const tokenEnv = pm.environment.get('token_env')
if (tokenEnv && tokenEnv === pm.environment.name) {
    const tokenTimestamp = Number.parseInt(pm.environment.get('token_timestamp'), 10)
    const elapsed = Date.now() - tokenTimestamp
    if (elapsed < 20 * 60000) {
        return
    }
}

// 직접적으로 firebase에 로그인 하는 코드
pm.sendRequest({
    url: `https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=${apiKey}`,
    method: 'POST',
    header: {
        'Content-Type': 'application/json',
    },
    body: {
        mode: 'raw',
        raw: JSON.stringify({
            email: pm.environment.get('auth_username'),
            password: pm.environment.get('auth_password'),
            returnSecureToken: true,
        }),
    },
}, function (err, res) {
    let json
    if ( ! err) {
        json = res.json()
        if (json.error) {
            err = json.error
        }
    }
    if (err) {
        pm.environment.unset('auth_token')
        pm.environment.unset('token_env')
        pm.environment.unset('token_timestamp')
        throw err
    }
    // 얻어진 값들은 Environments에 저장.
    pm.expect(json.idToken).to.not.be.undefined
    pm.environment.set('auth_token', json.idToken)
    pm.environment.set('token_env', pm.environment.name)
    pm.environment.set('token_timestamp', Date.now())
    pm.environment.set('uid', json.localId)
})