这个HS256令牌有什么问题?

时间:2018-02-28 21:46:03

标签: php firebase firebase-authentication jwt

我正在使用jwt-php和firebase-tokengenerator为自定义身份验证流程(https://github.com/firebase/firebase-token-generator-php)创建令牌。

我不断收到invalid_custom_token错误。像这样:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "invalid",
    "message": "INVALID_CUSTOM_TOKEN"
   }
  ],
  "code": 400,
  "message": "INVALID_CUSTOM_TOKEN"
 }
}

当我将生成的令牌放入https://jwt.io/时,我会收到无效的签名' UNTIL 我手动更改UID或displayName中的一个字符。

这是生成的令牌,在应用时会失败jwt.io网站和Firebase:

  

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhZG1pbiI6ZmFsc2UsImRlYnVnIjpmYWxzZSwiZCI6eyJ1aWQiOiI2NTQwMDA0NCIsImRpc3BsYXlOYW1lIjoiV2lsbHkgRSBDb3lvdGUifSwidiI6MCwiaWF0IjoxNTE5ODUyNzE1fQ.ScM_nZtwH1zCyiWnPKNi_JLTVwguKibS5z8FLjo6Lco

但如果我改变一个角色,它会突然传递jwt.io.这可能毫无意义,但是在我放弃整个方法并尝试别的东西之前,我在绳索的尽头试图通过这个愚蠢的步骤......

我使用Firebase for Google和username / pw auth,我正在尝试将第三方身份验证系统(LTI)连接到我的项目。

这是php:

$expires = time() + 3600;
$secret = 'XXXX';

try {
  $generator = new TokenGenerator($secret);
  $token = $generator
    // ->setOption('admin', false)
    // ->setOption('debug', true)
    // ->setOption('expires', $expires)
    ->setData(array('uid' => '65400044', 'displayName' => 'Willy E Coyote'))
    ->create();
} catch (TokenException $e) {
    echo "Error: " . $e->getMessage();
}
echo $token;

使用令牌的jquery:

success: function(fbToken){
  console.log('Response from FB token generator: ') + console.log(fbToken);
  console.log('Now try Firebase with token...');
  firebase.auth().signInWithCustomToken(fbToken).catch(function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    console.log('Errors: ' + error.message);
    // ...
  });

我也不明白为什么在控制台中有两次对Firebase的调用。第一个不会导致数据但是成功(200个代码)。第二个显示错误和400。 Console view showing 2 calls to Firebase

我已经准备好了解IAT的问题......我也想知道我是否已经获得了识别我的Firebase项目的所有必要信息 - php脚本中唯一的数据是Firebase项目秘密。

任何帮助或指示赞赏...

1 个答案:

答案 0 :(得分:0)

正如您在对原始帖子的评论中所写的那样,问题在于您使用了一个已弃用的令牌生成器,该生成器仅适用于Firebase已弃用的数据库机密。

使用新的SDK,您必须使用为项目生成的私钥对自定义令牌进行签名,您可以通过从项目设置中的Service Accounts Section下载凭证文件来检索自定义令牌。

如果您不想自己实施流程,我建议您查看https://github.com/kreait/firebase-php,以便您可以像这样工作:

use Kreait\Firebase\Factory;
use Kreait\Firebase\ServiceAccount;

$serviceAccount = ServiceAccount::fromJsonFile('/path/to/credentials.json');

$firebase = (new Factory)
    ->withServiceAccount($serviceAccount)
    ->create();

$uid = 'some-uid';
$additionalClaims = []; // optional

$customToken = $firebase->getAuth()->createCustomToken($uid, $additionalClaims);

您还可以验证客户端应用程序创建的ID令牌等,如https://firebase-php.readthedocs.io/en/latest/

所述

免责声明:我创建了库:)。