Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在我自己的数据库中使用firebase auth中的哪个firebase值作为uid?_Javascript_Firebase Authentication - Fatal编程技术网

Javascript 在我自己的数据库中使用firebase auth中的哪个firebase值作为uid?

Javascript 在我自己的数据库中使用firebase auth中的哪个firebase值作为uid?,javascript,firebase-authentication,Javascript,Firebase Authentication,我正在使用Firebase auth,我需要将经过身份验证的用户存储在我自己的用户表中(我只计划使用Firebase auth,而不是他们的后端服务)。但是,我不确定firebase提供的哪个值应该用作唯一标识符 在文档中,Firebase声明: uid = user.uid; // The user's ID, unique to the Firebase project. Do NOT use // this value to authenticat

我正在使用Firebase auth,我需要将经过身份验证的用户存储在我自己的用户表中(我只计划使用Firebase auth,而不是他们的后端服务)。但是,我不确定firebase提供的哪个值应该用作唯一标识符

在文档中,Firebase声明:

 uid = user.uid;  // The user's ID, unique to the Firebase project. Do NOT use
                   // this value to authenticate with your backend server, if
                   // you have one. Use User.getToken() instead.

根据上面的评论(见这里:),这意味着我不能依赖
uid

他们是说我应该使用

 user.getIdToken().then((token) => {
  // is this my UUID that I should store in my own db
  // this one? Its 926 characters long, 
  console.log(token);
 });

使用Firebase Auth
user.uid
为您自己的用户表设置密钥

客户端:

您的web应用程序在最终用户的浏览器中运行,并使用Firebase客户端SDK。例如,电子邮件和密码登录可能如下所示:

firebase.auth().signInWithEmailAndPassword(电子邮件,密码)
。然后((用户)=>{
//签到
// ...
})
.catch((错误)=>{
var errorCode=error.code;
var errorMessage=error.message;
});

在幕后,浏览器从Firebase身份验证服务获取JWT。每小时都会更新令牌,您可以使用事件侦听器获取这些令牌

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    // User is signed in, see docs for a list of available properties
    // https://firebase.google.com/docs/reference/js/firebase.User
    var uid = user.uid;
    // ...
    // Get the JWT (see line below)
  } else {
    // User is signed out
    // ...
  }
});
从用户对象可以获得JWT(存储在客户端浏览器中)

const jwt=await getIdToken().token;
(注意,我在这里混合了async/await样式和.then范例,所以您需要选择一个)

一旦有了JWT,您就可以使用它来调用后端服务,通常在HTTP请求的头中发送它

服务器端:

将JWT从HTTP请求头提取到
idToken
中,然后使用
verifyIdToken(idToken)
验证令牌。此方法在特权环境(AdminSDK)中运行。在幕后,verifyIdToken联系Firebase身份验证服务以验证JWT。Firebase身份验证服务托管在谷歌的基础设施中,但您无法直接访问它-只能通过verifyIdToken调用

如果您的后端服务在地球的另一端运行,则调用verifyIdToken时会有更高的延迟。可能会有一些缓存,但至少在您的第一个请求中肯定会用到。这就是为什么我在我的评论中写下你的问题,你可能想考虑在GCP中托管你的后端服务。 您不应该将JWT存储在数据库中,因为它们是由Firebase Auth客户端每小时重新生成的

一旦通过后端验证,就可以从JWT中提取uid

//idToken来自客户端应用程序
管理
.auth()
.verifyIdToken(idToken)
.然后((解码声音)=>{
const uid=decodedToken.uid;
// ...
})
.catch((错误)=>{
//处理错误
});

您完全可以使用UID作为数据库中每个用户数据的唯一键。这就是它的用途

我想你可能误解了这个评论。它试图解决的问题是通过API调用将UID发送到您自己的后端。任何知道如何调用API端点的人都可能伪造该调用,这意味着他们可以发送任何想要的UID。对于这些情况,客户机应用程序应该提供一个ID令牌到后端,以便使用Firebase Admin SDK进行验证。这是为您的后端发送有关用户信息的唯一安全方法,这样它就不会被黑客攻击


如果不将UID发送到后端,则不需要发送令牌并对其进行验证。如果您只是在本地或通过其他实现安全规则的Firebase产品使用UID,您根本不需要担心令牌。

为什么我需要自己验证idtoken?在成功登录电子邮件/密码后由firebase处理?这就是我使用firebase的原因——不必自己做整个验证。谢谢你的详细回答。尽管它与我的问题没有100%的关联,但它非常有价值,我可能很快就会回来讨论它。值得一提的是,尽管您可能不想使用其他一些Firebase产品,您可能会发现,在谷歌云平台的范围内托管您的服务会更有效,从而在对后端进行身份验证时帮助减少网络延迟。IMO Cloud Run对于API来说是一款特别好的产品,它与Firebase Auth.ELI5配合得非常好?不确定您所说的“性能更高”是什么意思在谷歌云平台领域内托管您的服务以帮助减少网络延迟什么服务?我假设您有一个前端应用程序,您可以对其进行身份验证。由于您选择不使用Firebase函数或直接从客户端应用程序调用Firestore,因此您需要通过其他方式(通常使用API服务)提供一些后端功能?是的。我计划在后端使用Django(作为nuxt前端的RESTAPI)和Postgres db。我转向firebase的唯一原因是,设置SPA上的auth是一件痛苦的事情。我使用JavaScript编写了我的答案,因为这是问题中唯一可用的标记。您需要调整下面的示例,以便在服务器端代码中使用Python等效代码