我正在构建一个使用Microsoft Graph登录的企业应用程序。成功签名后,我想使用令牌发送给Firebase Auth进行身份验证(这样我就可以保护对数据库的访问)。
成功登录后收到的令牌无法直接用于Firebase。
在Firebase custom Auth instructions page上说:
获取项目的服务器密钥:
- 转到项目设置中的“服务帐户”页面。
- 点击“服务帐户”页面Firebase管理SDK部分底部的“生成新私钥”。
- 新服务帐户的公钥/私钥对会自动保存在您的计算机上。将此文件复制到您的身份验证服务器。
醇>
第三点说您需要输入密钥到认证服务器。是否可以使用 Microsoft Graph 或 Azure AD ?
Firebase为您提供的密钥是JSON
文件。我已经检查了 Microsoft App注册门户,它允许您编辑应用Manifest,但没有运气。
JSON
文件如下所示:
{
"type": "service_account",
"project_id": "APP_ID",
"private_key_id": "KEY_ID_VALUE",
"private_key": "-----BEGIN PRIVATE KEY----<KEY VALUE>-----END PRIVATE KEY-----\n",
"client_email": "firebase-adminsdk-0ubvc@********.iam.gserviceaccount.com",
"client_id": "XXXXXXXXXXXX",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-0ubvc%XXXXXXXX.iam.gserviceaccount.com"
}
我似乎无法找到任何涵盖此问题的github项目或stackoverflow线程。
如何使用MS Graph或Azure AD接收自定义令牌?
答案 0 :(得分:5)
我现在已经完全解决了这个问题。通过对Stackoverflow的广泛研究和大量帮助,我设法解决了这个问题。
目前已弃用数据库机密并使用旧版Firebase令牌生成器。现在Firebase Admin
导入已经足够了。
<击> 1。您 DO 需要在创建Firebase令牌时将私钥发送到firebase功能。在Firebase控制台中,您可以解压缩密钥并将文件重命名为service-account.json
。在执行Firebase deploy
在index.js
文件中,您可以输入以下代码来获取服务文件:
const admin = require('firebase-admin');
编写接受来自其他身份验证服务的信息的功能:
// Create a Firebase token from any UID
exports.createFirebaseToken = functions.https.onRequest((req, res) => {
// The UID and other things we'll assign to the user.
const uid = req.body.uid;
const additionalClaims = {
name: req.body.name,
email: req.body.email
};
// Create or update the user account.
const userCreationTask = admin.auth().updateUser(uid, additionalClaims).catch(error => {
if (req.method === 'PUT') {
res.status(403).send('Forbidden!');
}
if (req.method === 'GET') {
res.status(403).send('Please use POST for this function');
}
// If user does not exists we create it.
if (error.code === 'auth/user-not-found') {
console.log(`Created user with UID:${uid}, Name: ${additionalClaims.name} and e-mail: ${additionalClaims.email}`);
return admin.auth().createUser({
uid: uid,
displayName: additionalClaims.name,
email: additionalClaims.email,
});
}
throw error;
console.log('Error!');
});
return Promise.all([userCreationTask]).then(() => {
console.log('Function create token triggered');
// Create a Firebase custom auth token.
admin.auth().createCustomToken(uid, additionalClaims).then((token) => {
console.log('Created Custom token for UID "', uid, '" Token:', token);
res.status(200).send(token);
return token
});
});
});
使用res.status
回复非常重要,因为这将完成任务。单个return
语句不会这样做。
您可以在github
您现在可以使用 Alamofire 和swift
Alamofire.request("https://us-central1-<YOUR DATABASE REFERENCE>.cloudfunctions.net/createFirebaseToken",
method: .post, parameters: parameters, encoding: JSONEncoding.default).
responseString(completionHandler: { (token) in
// Handle the result here
})
在这种情况下,Parameters
是一个常规JSON
文件,其中包含您要添加到用户Firebase帐户的内容。
重要拥有云功能网址的任何人都可以触发此令牌铸币。因此,请确保添加安全措施来处理此问题。 This is briefly mentioned in a Firecast video on youtube made by Firebase并在this thread in Stackoverflow
您现在已经过 Firebase 和 Microsoft
我还添加了一个额外的安全层,通过检查我从Microsoft获得的ID
是否与Firebase中经过身份验证的帐户中存储的ID
相同。
答案 1 :(得分:1)
我已经为Firebase Web和基于浏览器的联合身份验证创建了一个示例here。来自Azure AD的身份验证响应通过功能进行验证,自定义firebase令牌并发送到前端;发送到Firebase Auth服务。
答案 2 :(得分:0)
问题是您需要使用您自己的的一些代码来响应AAD IDP身份验证成功,然后生成要由Firebase使用的JWT。那个JWT is generated使用private key supplied by firebase。您表示至少部分代码是使用Java编写的,这是一个好消息,因为它是Firebase Admin SDK支持的语言之一。从理论上讲,我认为您可以在移动应用程序代码中执行该令牌生成,但我强烈建议不要这样做,因为这需要在您的应用程序中部署您的私钥,这会危及它。您需要站起来一个可以处理来自您的应用程序的身份验证请求的Web服务,并使用Firebase Admin SDK生成的JWT进行响应。一旦您的移动应用程序具有您的服务生成的JWT,那么它就可以使用它来连接到该用户的Firebase。
答案 3 :(得分:0)
它比你想象的要简单得多。在使用Microsoft进行身份验证并获得Microsoft凭据后,您只需获取该凭据的关联Microsoft用户ID即可。然后,您可以制作Firebase自定义令牌,并将Firebase uid
设置为相同的Microsoft用户ID。例如,您可以使用Firebase Admin Node.js SDK执行以下操作:
admin.createCustomToken(msftUid, additionalUserClaims)
.then(customToken => {
// Return this to the client.
})
将其发送回客户端后,您可以致电signInWithCustomToken(customToken)
,这将使用Firebase身份验证登录同一用户。该用户将currentUser.uid
等于Microsoft用户ID。