我一直在尝试向我的应用程序添加对多租户的支持。
我这样初始化
const app = firebase.initializeApp();
const tenantManager = app.auth().tenantManager();
const tenant = await tenantManager.createTenant({ displayName: `test- tenant` });
const auth = tenantManager.authForTenant(tenantId);
然后,我的应用程序的一部分使用auth.createCustomToken(uid)
来创建令牌,然后可以将其交换为标准id令牌(使用其余端点/accounts:signInWithCustomToken
。
尝试创建自定义令牌时,出现以下错误
Error: This operation is not supported in a multi-tenant context
此外,当手动创建令牌(使用jsonwebtoken
和服务帐户密钥)时,错误
Specified tenant ID does not match the custom token
在尝试通过REST API验证令牌时出现
其他人是否遇到过此错误,或者有人知道在多租户环境中生成和验证自定义令牌的另一种方式(或者,是否知道以某种方式仅在给定uid的情况下将用户登录)?
答案 0 :(得分:0)
当前,在多租户上下文中不支持自定义令牌身份验证。此功能仍为under construction。您可以查看受支持功能的完整列表here。
答案 1 :(得分:0)
不是使用API来生成自定义令牌,而是使用服务帐户中的JWT
生成private_key
来签名并确保您具有下面定义的值
const jwt = require(`jsonwebtoken`);
const payload = {
uid,
sub: serviceAccount.client_email,
tenant_id: tenantId
};
jwt.sign(payload, serviceAccount.private_key, {
audience: `https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit`,
issuer: serviceAccount.client_email,
algorithm: `RS256`,
expiresIn: 0
});
注意:有效负载中的tenant_id
。
现在,当通过POST
交换到
`https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=${encodeURIComponent(webApiKey)}`
确保tenantId
是请求的JSON正文中的属性,并且与令牌中找到的tenant_id
匹配。
{
tenantId, // Make sure this matches the "tenant_id" claim in the idToken
token: idToken,
returnSecureToken: true
}
第二部分记录在https://cloud.google.com/identity-platform/docs/reference/rest/client/#section-verify-custom-token中(但在撰写本文时未在原始的firebase auth文档中显示)