Firebase Auth -> 使用 signInWithCustomToken 创建的用户没有电子邮件地址

Posted

技术标签:

【中文标题】Firebase Auth -> 使用 signInWithCustomToken 创建的用户没有电子邮件地址【英文标题】:Firebase Auth -> user created with signInWithCustomToken has no email address 【发布时间】:2017-06-21 17:23:42 【问题描述】:

我将 Firebase 自定义身份验证系统用于使用 Ionic 制作的移动应用,并且我使用 Laravel 5.2 作为自定义身份验证后端。

当新用户注册时,我在 laravel 中生成一个令牌(使用 firebase/php-jwt)并将其返回给移动应用程序。

在此注册过程中,应用接收令牌并使用以下代码在 firebase 上创建用户:

firebase.auth().signInWithCustomToken($auth.getToken())
    .then(function(response) 
        $log.debug(response);
    )
    .catch(function(error) 
        $log.debug(error.code + ' - ' + error.message);
    );

在后端,我使用以下代码生成令牌:

private function create_custom_token($uid, $email, $is_premium_account) 
    $service_account_email = env('SERVICE_ACCOUNT_EMAIL'); 
    $private_key = env('SERVICE_PRIVATE_KEY');

    $now_seconds = time();
    $payload = array(
        "iss" => $service_account_email,
        "sub" => $service_account_email,
        "aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
        "iat" => $now_seconds,
        "exp" => $now_seconds+(60*60),  // Maximum expiration time is one hour
        "uid" => $uid,
        "claims" => array(
            "premium_account" => $is_premium_account,
            "email" => $email,
        )
    );
    return JWT::encode($payload, $private_key, "RS256");

如下图所示,用户是在 firebase 上生成的,但问题是它没有电子邮件地址,只有 UID。

最好有电子邮件地址以便轻松识别用户。

也许有人可以帮忙。谢谢!

更新:

我稍微更改了 create_custom_token 函数的 $payload:

  $payload = array(
      "iss" => $service_account_email,
      "sub" => $service_account_email,
      "aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
      "iat" => $now_seconds,
      "exp" => $now_seconds+(60*60),  // Maximum expiration time is one hour
      "uid" => $uid,
      "email" => $email,
      "email_verified"          => false,
      "claims" => array(
        "premium_account" => $is_premium_account,
        "email" => $email,
        "email_verified"          => false,
      )
    );

我还做了一些测试,看看传递给 firebase 的令牌包含所有需要的数据。我在后端使用相同的库 (firabase/php-jwt) 解码了编码令牌,并且接缝没问题,但 firebase 仍然创建没有电子邮件地址的用户。

我不知道我错过了什么:(

【问题讨论】:

【参考方案1】:

我认为自定义令牌无法做到这一点。

node.js Admin SDK 允许您创建/更新用户并为该用户铸造自定义令牌。这将是理想的方法,但是当您使用 php 时,我推荐以下解决方案:

您必须使用客户端 js 库设置电子邮件:

铸造自定义令牌后,将其与电子邮件一起发送到客户端应用程序。无论如何,您已经在发送它,只需将电子邮件连同它一起传递即可。

在客户端应用程序中,signInWIthCustomToken 和用户返回 updateEmail 并提供如下电子邮件:

firebase.auth().signInWithCustomToken(token)
  .then(function(u‌​ser) 
    return user.updateEmail(email);
  ).catch(...)

【讨论】:

看看这里:firebase.google.com/docs/auth/web/custom-auth。我遵循了 Firebase 的官方指南,如您所见,我创建了用户,但没有电子邮件或提供商,仅使用 UID 是的,我明白了。修改并添加以下内容以更新电子邮件(您必须将其与自定义令牌一起发送回客户端): firebase.auth().signInWithCustomToken(token).then(function(user) return user.updateEmail(电子邮件);).catch(...) 谢谢!那行得通!您能否更新答案以确认它是正确的。顺便说一句,这是使用自定义身份验证系统执行此操作的正确方法,还是最好使用一些服务器端库并使用 Firebase Admin SDK 从服务器创建用户?在我使用 php 的情况下,直到现在我还没有找到任何库。 我将代码 sn-p 添加到我的解决方案中。不知何故,它没有以我选择的格式应用它。无论如何,正如您所说,理想情况下,node.js 管理库允许您使用指定的电子邮件创建用户/更新用户。然后,您将创建一个自定义令牌,该令牌在客户端 signInWithCustomToken 将使用电子邮件集登录用户,而无需在客户端上手动设置它。在为 php 提供相同的功能之前,您必须这样做。我个人认为这两种情况都是有效的。确保在电子邮件属于其他帐户的情况下发现错误。 我在 laravel 后端检查重复的电子邮件。我尝试使用相同的电子邮件和firebase添加相同的用户,它没有抛出任何错误,它只是创建了另一个具有不同uid且没有电子邮件的用户。或者我也可以在 user.updateEmail(email) 之后像 user.updateEmail(email).catch() 一样制作 .catch()?无论如何感谢您的帮助。我会更深入地研究这一切。

以上是关于Firebase Auth -> 使用 signInWithCustomToken 创建的用户没有电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

使用自己的身份验证服务器的firebase-auth模块和firebase-common-auth的重复

使用自己的身份验证服务器复制 firebase-auth 模块和 firebase-common-auth

致命错误:找不到模块“firebase_auth”@import firebase_auth

未处理的异常:[firebase_auth/unknown] null:使用颤振/firebase 进行电话身份验证时出错

Auth0 与 Firebase 委托

未捕获的 TypeError: (0 , _firebase.auth) 不是函数