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(user)
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 进行电话身份验证时出错