我正在关注firebase/identity toolkit docs,以获取SAML身份提供商。成功登录后,重定向结果将包含从提供程序派生的属性:
provider = new firebase.auth.SAMLAuthProvider('saml.test-provider');
firebase.auth().signInWithRedirect(provider);
...
firebase.auth().getRedirectResult().then(function(result) {
if (result.credential) {
console.log(result.additionalUserInfo.profile) // Custom provider claims, e.g., {"provider-foo":"bar"}
}
}
从文档中,也可以通过
获得相同的值 result.user.getIdTokenResult().idTokenResult.claims.firebase.sign_in_attributes
firebase.sign_in_attributes
这些相同的属性似乎没有存储在firebase_admin SDK中可访问的任何位置:
from firebase_admin import auth
user = auth.get_user(uid)
print(user.custom_claims) # => None ... *provider* claims aren't here
print(user.provider_data[0]) # => has `federatedId` and some others, but still no custom provider claims
有什么办法可以在管理SDK中获取此信息?有什么方法可以判断Firebase是否将其保存吗?我需要在Firestore中捕获它吗(因为用户可以伪造来自提供者的声明,这没有风险吗?)
谢谢!
答案 0 :(得分:2)
其他SAML属性仅保留在可通过以下方式访问的令牌声明中:
result.user.getIdTokenResult().idTokenResult.claims.firebase.sign_in_attributes
它们不存储在用户记录中。出于隐私原因,Identity Platform / Firebase Auth不会在存储中保留其他用户信息。
但是,您始终可以通过Admin SDK将所需的声明存储在记录中。 您将ID令牌发送到服务器,进行验证,解析所需的声明并将其设置在用户记录上。
这里是通过Node.js Admin SDK提供的示例。
app.post('/saveUserClaims', (req, res) => {
// Get the ID token passed.
const idToken = req.body.idToken;
admin.auth().verifyIdToken(idToken)
.then(function(decodedToken) {
const uid = decodedToken.uid;
// ...
const samlClaims = decodedToken.firebase.sign_in_attributes;
// You would filter the claims as there could be too many.
// You can also save these claims in your database, etc.
return admin.auth().setCustomUserClaims(uid, samlClaims)
.then(() => {
res.status(200).end();
});
}).catch(function(error) {
// Handle error
});
});
也就是说,通常无需保存这些声明,因为它们将始终在ID令牌中可用,并且您可以从安全规则或将ID令牌传递到服务器进行验证时访问它们。这是一种更好的方法,因为您不会遇到同步问题,即数据库与用户属性不同步。