根据本教程:https://firebase.google.com/docs/auth/server?hl=es#crear_un_token_personalizado
我可以使用服务器中生成的JWT对Firebase应用(客户端)中的用户进行身份验证。
为了实现这一点,我在Laravel项目中添加了一个新的依赖项:jwt-auth
我已使用常规JWT正确设置了身份验证。但是,对于Firebase中的身份验证,我需要使用教程中描述的自定义参数生成特定的JWT。
我已经更改了参数。但它还需要使用RS256
算法。改变算法时我遇到了错误。
错误显示Could not create token: openssl_pkey_get_details() expects parameter 1 to be resource, boolean given
。
在Github中报告了一个问题,它告诉我需要两个密码(私钥和公钥)。但我只有一把钥匙,取自Firebase控制台。
有人使用现有数据库中的凭据实施了Firebase身份验证吗?
我真的需要两个密码才能使用上述算法吗?
请给我一些想法。提前谢谢。
答案 0 :(得分:1)
因此,我们已经使用tymondesigns / jwt-auth在后端进行了令牌授权,现在我们想利用我们的令牌登录firebase。
<强> 1。更改算法
默认情况下,该软件包使用对称算法HS256,它使用环境中的JWT_SECRET进行编码/解码。 Firebase需要RS256,所以为了继续我们,显然要将算法改为RS256。
转到 .env 文件并添加下一个变量:
JWT_ALGO=RS256
JWT_PUBLIC_KEY=credentials/public.key
JWT_PRIVATE_KEY=credentials/private.key
JWT_PASSPHRASE=super_secret
同时修改配置文件 config / jwt.php :
'keys' => [
'public' => 'file://' . base_path( env('JWT_PUBLIC_KEY') ),
'private' => 'file://' . base_path( env('JWT_PRIVATE_KEY') ),
'passphrase' => env('JWT_PASSPHRASE'),
],
<强> 2。获取服务帐户RSA private并创建公共
如您所见,我们将app配置为在your_project / credentials文件夹中查找密钥,文件名为public.key和private.key。所以我们需要创建一个密钥对。
// Create new dummy private key inside your_project/credentials project
openssl genrsa -out private.key 1024
接下来打开您的Google服务帐户.json文件并将private_key字符串复制到private.key文件(实际上替换一个键),并替换&#39; \ n&#39;符号到新行。
现在生成基于google private的公钥:
openssl rsa -in private.key -pubout -out public.key
创建密钥后,测试您的项目验证,它必须与新的RS256 alg一起正常工作。
第3。为firebase创建不同的(第二个)令牌
此外,我发现无法在项目和firebase中使用单一令牌来授权用户,因为需要声明firebase和默认的jwt-auth冲突。 jwt-auth使用&#39; sub&#39;存储用户的id,fire_account_email的firebase。可能还有其他问题,所以我为firebase创建了一个特殊的(第二个)令牌。将方法添加到用户模型:
/**
* Creates addiotional jwt token for the firebase
*
* @return string
*/
public function firebaseToken()
{
$googleServiceAccountEmail = env('GOOGLE_SERVICE_ACCOUNT_EMAIL');
$time = time();
$expires = $time + (60 * 60);
$customClaims = [
'iss' => $googleServiceAccountEmail,
'sub' => $googleServiceAccountEmail,
'aud' => env('GOOGLE_AUD'),
'iat' => $time,
'exp' => $expires,
'uid' => $this->id
];
$payload = JWTFactory::customClaims($customClaims)->make();
$token = \JWTAuth::encode($payload)->get();
return $token;
}
在登录,邀请,注册等之后返回此额外令牌...并使用它登录客户端的firebase。
Huuuh,我希望大家,我的经验和这个小小的指导&#34;会帮助你。