使用Laravel凭据在Firebase中进行身份验证

时间:2016-11-15 22:35:06

标签: algorithm laravel jwt firebase-authentication

根据本教程: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身份验证吗?

我真的需要两个密码才能使用上述算法吗?

请给我一些想法。提前谢谢。

1 个答案:

答案 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;会帮助你。