4

이 문제는 많은 질문을 받았지만 여전히 문제를 해결할 수있는 정확한 대답을 찾을 수없는 것 같습니다.node.js admin sdk로 토큰을 만들 때 Firebase REST 인증이

access_token 매개 변수를 추가하여 REST 호출을 사용하여 Firebase에 액세스하려고합니다.

access_token과 다음 코드를 사용하여 Node.js를 관리 SDK를 사용하여 만들어집니다 :

var admin = require("firebase-admin"); 

var serviceAccount = require("./pk.json"); 

admin.initializeApp({ 
    credential: admin.credential.cert(serviceAccount), 
    databaseURL: "https://XXX.firebaseio.com" 
}); 

var uid = "1234"; 


admin.auth().createCustomToken(uid) 
    .then(function(customToken) { 
    // Send token back to client 
    console.log("Token: "+customToken); 
    }) 
    .catch(function(error) { 
    console.log("Error creating custom token:", error); 
    }); 

문제는 그 나는 Node.js를에서 생성 된 토큰을 가지고 그것을 내 REST 호출을 사용하는 경우, I Unauthorized request 오류가 발생합니다.

사람들이 토큰을 발행 할 때 범위 param을 추가했지만 Node.js Admin SDK로이를 수행 할 수있는 방법을 찾지 못했음을 읽은 적이 있습니다.

Google의 문서에이 문제가 너무 자세히 설명되어 있지 않습니다. 이 문제를 해결하기 위해 어떤 노력을 기울일 수 있습니까?

답변

5

Firebase REST API를 인증하는 데 사용하는 토큰이 올바른 토큰 유형이 아닙니다. Sign in using custom tokens on clients에 설명 된대로 signInWithCustomToken() 메소드를 통해 Firebase 클라이언트 SDK 중 하나를 인증하는 데에만 사용할 수있는 Firebase Auth 사용자 정의 토큰을 사용하고 있습니다.

Firebase REST API를 인증하려면 Firebase ID 토큰 (사용자 기반 액세스 용) 또는 Google OAuth2 액세스 토큰 (관리자 액세스 용)이 있습니다.

가 인증합니다 중포 기지 ID 토큰으로

다양한 중포 기지 클라이언트 SDK에의 액세스 토큰을 검색하는 방법에 대한 설명은 Retrieve ID tokens on the client를 참조하십시오. 당신은 또한 ID 토큰에 대한 중포 기지 사용자 토큰을 교환하고 문서화되지 않은 REST API를 통해 토큰 쌍을 새로 고칠 수 있습니다 :

엔드 포인트 :https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=<API_KEY>

방법 :POST

요청 본문 :{ "token": <CUSTOM_TOKEN>, "returnSecureToken": true }

<API_KEY>은 (는) Firebase 콘솔에서 가져온 것과 동일한 API 키입니다. Firebase 클라이언트. <CUSTOM_TOKEN>은 Firebase 사용자 정의 토큰입니다.

ID 토큰은 한 시간 후에 만료 때문에, 당신이 다른 문서화되지 않은 REST API를 통해 그들을 새로 고침 새로 고침 토큰을 사용해야합니다

엔드 포인트 :https://securetoken.googleapis.com/v1/token?key=<API_KEY>

방법 :POST

요청 본문 :{ "refresh_token": <REFRESH_TOKEN>, "grant_type": "refresh_token" }

<API_KEY>은 이전과 동일한 API 키입니다. <REFRESH_TOKEN>은 이전 API 호출의 새로 고침 토큰입니다.

ID 토큰을 얻은 후에는 auth 쿼리 매개 변수를 통해 REST API에 전달하여 요청을 인증 할 수 있습니다. 요청은 클라이언트에 로그인 한 최종 사용자가 요청하는 것처럼 Firebase 보안 규칙을 준수합니다.

가 인증합니다 구글 액세스 토큰과 구글의 OAuth2 액세스 토큰 인증을

은, 당신이 가장 먼저해야 할 일이 하나를 얻을 수 있습니다. 이를 수행하는 방법에 대한 설명은 Retrieving an access token을 참조하십시오. 현재 Java 예제 만 포함되어 있지만 이는 Node.js를 비롯한 여러 언어로 가능합니다. ID 토큰을 받으면 access_token 쿼리 매개 변수를 통해 REST API에 전달하여 요청을 인증 할 수 있습니다. 요청은 관리자 액세스 권한으로 이루어지며 모든 Firebase 보안 규칙을 무시하고 완전한 읽기 및 쓰기 권한을 부여합니다.

+0

그래서 제대로 이해하면 클라이언트 SDK (서버의 REST)없이 ID 토큰을 얻을 수있는 방법이 없습니까? – Ran

+0

실제로 사용할 수있는 문서화되지 않은 REST API가 있습니다. 실제로 공식 문서에서이 REST API를 문서화하는 중입니다. 그러나 차단 해제하기 위해 제 답변을 업데이트했습니다. – jwngr

+0

감사합니다. @jacobawenger,하지만 귀하의 지시를 따르려고하면 "서명을 확인할 수 없습니다."라는 메시지가 나타납니다. auth param의 값으로 id_token을 사용한 후 .. 무엇이 잘못 되었을까요? – Ran