调用 getUser 时出现 firebase-admin 身份验证错误,但调用 verifyToken 时工作正常
firebase-admin auth error while calling `getUser`, but work fine when calling verifyToken
在服务器端使用 firebase-admin
时,
我需要从 firebase 身份验证中获取用户数据。
但是我发现如果我使用 firebase 提供的 jwt 令牌,
我无法从解码令牌中获取电子邮件或其他提供商的数据。
(很确定我已经正确添加了特定范围。)
然后我转向使用 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)
这可能是权限错误,
根据这个猜测,我发现这可能与Whosebug上的这个问题有关:
但即使我将管理客户端的 IAM 更改为角色:编辑器,
这个错误仍然发生。
想知道发生了什么,
以及为什么管理员可以验证令牌但可以被授予读取用户数据的权限(即使我授予服务帐户对我的项目的根访问权限)。
任何建议都会对我有所帮助。
关于问题所在,我最好的猜测是您正在使用的服务帐户密钥文件中的私钥无效。要获取有效的服务帐户密钥文件,请按照 Add Firebase to your app 中的说明进行操作。有一个很好的 UI,您可以使用它来生成一个新的 JSON 文件,该文件应该具有您的项目的所有适当权限。您可以像这样使用它来初始化您的 SDK:
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
在服务器端使用 firebase-admin
时,
我需要从 firebase 身份验证中获取用户数据。
但是我发现如果我使用 firebase 提供的 jwt 令牌,
我无法从解码令牌中获取电子邮件或其他提供商的数据。
(很确定我已经正确添加了特定范围。)
然后我转向使用 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)
这可能是权限错误, 根据这个猜测,我发现这可能与Whosebug上的这个问题有关:
但即使我将管理客户端的 IAM 更改为角色:编辑器, 这个错误仍然发生。 想知道发生了什么, 以及为什么管理员可以验证令牌但可以被授予读取用户数据的权限(即使我授予服务帐户对我的项目的根访问权限)。
任何建议都会对我有所帮助。
关于问题所在,我最好的猜测是您正在使用的服务帐户密钥文件中的私钥无效。要获取有效的服务帐户密钥文件,请按照 Add Firebase to your app 中的说明进行操作。有一个很好的 UI,您可以使用它来生成一个新的 JSON 文件,该文件应该具有您的项目的所有适当权限。您可以像这样使用它来初始化您的 SDK:
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});