2017-01-25 21 views
2

在服務器端使用firebase-admin, 我需要從Firebase身份驗證中獲取用戶數據。 但我發現如果我使用firebase提供的jwt令牌, 我無法從解碼令牌獲取電子郵件或其他提供者的數據。 (很確定我已經正確添加了特定範圍)。firebase-admin auth在調用`getUser`時出錯,但在調用verifyToken時工作正常

然後我轉向使用firebase admin api從Firebase的身份驗證中獲取用戶數據。

的代碼如下所示:

import * as admin from 'firebase-admin' 

const auth = admin.auth() 
auth.verifyIdToken(idToken) 
    .then(decodedToken => decodedToken.user_id) 
    .then(uid => { 
    auth.getUser(user_id) 
     .then((userRecord) => { 
     console.log("Successfully fetched user data:", userRecord.json(); 
     }) 
     .catch(function(error) { 
     console.log("Error fetching user data:", error); 
     }); 
    }) 

然後,我得到了一個錯誤:

Error fetching user data: Error: error:0906D06C:PEM routines:PEM_read_bio:no start line 
    at Error (native) 
    at Sign.sign (crypto.js:283:26) 
    at Object.sign (~/app/node_modules/jwa/index.js:55:45) 
    at Object.jwsSign [as sign] (~/app/node_modules/jws/lib/sign-stream.js:23:24) 
    at Object.module.exports [as sign] (~/app/node_modules/firebase-admin/node_modules/jsonwebtoken/sign.js:144:16) 
    at CertCredential.createAuthJwt_ (~/app/node_modules/firebase-admin/lib/auth/credential.js:190:20) 
    at CertCredential.getAccessToken (~/app/node_modules/firebase-admin/lib/auth/credential.js:162:26) 
    at SignedApiRequestHandler.sendRequest (~/app/node_modules/firebase-admin/lib/utils/api-request.js:110:32) 
    at ~/app/node_modules/firebase-admin/lib/auth/auth-api-request.js:381:50 
    at process._tickDomainCallback (internal/process/next_tick.js:129:7) 

這可能是根據這個猜測權限錯誤, ,我發現,這可能是與此問題在計算器上:

Firebase admin().auth().getUser(uid) Error: An internal error has occurred 'auth/internal-error'

但即使我將管理客戶端的IAM更改爲role:editor, 這個錯誤仍然發生。 想知道發生了什麼, 和爲什麼管理員可以驗證令牌,但可以授予讀取用戶數據(即使我給服務帳戶根訪問我的項目)。

任何建議對我都有幫助。

+0

您提供的代碼示例有一堆語法和代碼錯誤,這些錯誤使我很難再現。例如,你永遠不會調用initializeApp()。您還使用未定義的'idtoken'和'user_id'變量。最後,你的第一個'console.log()'行缺少一個右括號。你可以把一個完整的repro放在一起來幫助我們調試嗎?請參閱下面的答案,瞭解如何最輕鬆地解決您的問題。如果這不起作用,請嘗試升級到最新版本的SDK(4.0.6),該SDK有一些新的錯誤處理。另外,知道你在哪裏得到了無效的密鑰文件會很好。 – jwngr

回答

1

我最好的辦法是什麼出問題是您使用的服務帳戶密鑰文件中的私鑰是無效的。要獲得有效的服務帳戶密鑰文件,請按照Add Firebase to your app中的說明進行操作。有一個很好的用戶界面,您可以使用它來生成一個新的JSON文件,該文件應該具有適合您項目的所有權限。您可以使用它來初始化您的SDK,如下所示:

var serviceAccount = require("path/to/serviceAccountKey.json"); 

admin.initializeApp({ 
    credential: admin.credential.cert(serviceAccount) 
}); 
相關問題