我们有一个应用程序(ios,android,web),用户通过用户名和密码登录。我们也使用谷歌防火墙,因为它的强大和易于集成。
用户名和密码,主要是属于的网站,我们正在收集数据。(举个例子--如果他们在没有应用程序的情况下使用网站,并且更改了密码,那么他就无法登录应用程序)
现在提到的网站主机给我们API访问权限,通过OpenId登录以获取API的访问令牌。因为我们是一个安全的风险,因为我们存储用户的密码!
对于API访问,我们实际上不需要存储用户的用户名和密码,因为它们无论如何都是多余的。但是,如果我们想要添加一个特性(例如,消息发送或进一步的数据存储),我们需要让用户登录到防火墙中。
到目前为止,我们使用的是用于(第一个)签名的以下代码段:
firebaseAuth.createUserWithEmailAndPassword(
email: email, password: password);
对于已经在用户中注册的用户:
firebaseAuth.signInWithEmailAndPassword(
email: email, password: password);
注意,类似的凭据也用于在API上登录。(因为用户已经注册)
我们如何使用上述信息登录防火墙,而不问两次密码和用户名(一次为我们,一次为API)?
我们已经试过:
await firebaseAuth.signInWithCustomToken(token)
当然,对于来自OpenId的jwl令牌,它不能工作,因为令牌不包含uid引用。
发布于 2022-05-27 11:39:22
溶液
创建一个Firebase函数,就像在火基云函数中描述的那样。
请注意,如果您想要创建定制令牌,云功能需要权限。关于initializeApp(.)
admin.initializeApp({
serviceAccountId: '{App_Name}@appspot.gserviceaccount.com',
});
因此,必须选择正确的服务帐户,您还必须赋予他生成令牌的权限。(见=> 堆栈过流问题
然后,云函数看起来是这样的:
export const functionName= functions.https.onRequest(async (request, response) => {
const id = request.query.id;
const passcode = request.query.passcode; // not really needed
// add other passcodes for different authentications
if (passcode == "{COMPARE SOMETHING}") {
await admin.auth().createCustomToken(id).then((customToken) => {
response.status(200).send({
'id': id,
'customToken': customToken
});
}).catch((error) => {
response.status(500).send({
'ErrorMessage': "No token could be generated",
"Error": error
});
});
}
else {
response.status(500).send({
'ErrorMessage': "Passcode wrong"
});
}
});
另一方面,我们在移动应用程序上有代码:
// Get JWT Token
Map<String, dynamic> jwtpayload =
Jwt.parseJwt(response_decoded['id_token']); // use import 'package:jwt_decode/jwt_decode.dart';
final queryParameters = {
'id': jwtpayload ['sub'],
'passcode': 'APassCode',
};
final uri = Uri.https('us-central1-{yourApp}.cloudfunctions.net',
'/{functionName}', queryParameters);
final cloud_function_api_call = await client.post(uri);
var decoded_cloud_function_api_call =
jsonDecode(cloud_function_api_call.body);
最后:
await firebaseAuth.signInWithCustomToken(
decoded_cloud_function_api_call['customToken']);
我希望它能帮助其他面临类似问题的人。
https://stackoverflow.com/questions/72357214
复制相似问题