【问题标题】:JWT token generation fails, MUX API responds with errorJWT 令牌生成失败,MUX API 响应错误
【发布时间】:2022-01-05 01:55:32
【问题描述】:

我正在尝试运行 MUX 网站上记录的 PHP 示例代码 here。我刚刚生成了一个全新的 API 密钥 + 秘密并将它们存储在 mux-credentials.php 文件中:

define('MUX_TOKEN_ID', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
define('MUX_TOKEN_SECRET', '<base64-encoded-string-here>');

我使用 composer 按照here 的指示安装 Firebase\JWT,然后运行 ​​MUX 文档中指定的确切代码:

// load libs
require_once 'vendor/autoload.php';

// load MUX credentials
require_once 'mux-credentials.php';

use \Firebase\JWT\JWT;


$myId = "<MY-ASSET-ID-HERE>";       // Enter the id for which you would like to get counts here
$myIdType = "asset_id";   // Enter the type of ID provided in my_id; one of video_id | asset_id | playback_id | live_stream_id
$keyId = MUX_TOKEN_ID;      // Enter your signing key id here
$keySecret = MUX_TOKEN_SECRET;  // Enter your base64 encoded private key here

$payload = array(
        "sub" => $myId,
        "aud" => $myIdType,
        "exp" => time() + 600, // Expiry time in epoch - in this case now + 10 mins
        "kid" => $keyId
);

$jwt = JWT::encode($payload, base64_decode($keySecret), 'RS256');


print "$jwt\n";

此代码出现致命错误:

PHP Warning:  openssl_sign(): supplied key param cannot be coerced into a private key in /home/example/vendor/firebase/php-jwt/src/JWT.php on line 225
PHP Fatal error:  Uncaught DomainException: OpenSSL unable to sign data in /home/example/vendor/firebase/php-jwt/src/JWT.php:227
Stack trace:
#0 /home/example/vendor/firebase/php-jwt/src/JWT.php(195): Firebase\JWT\JWT::sign()
#1 /home/example/people-watching.php(30): Firebase\JWT\JWT::encode()
#2 {main}
  thrown in /home/example/vendor/firebase/php-jwt/src/JWT.php on line 227

如果我像这样删除 JWT::encode 调用中的最后一个参数:

$jwt = JWT::encode($payload, base64_decode($keySecret));

然后代码成功运行,并生成一个长的base64编码字符串。但是,当我尝试使用它来联系 API 时,该 JWT 字符串会导致错误:

curl 'https://stats.mux.com/counts?token=<JWT-HERE>'

MUX api 响应:

{"error":{"type":"internal error","messages":["Could not get signing key."]}}

谁能帮我修复此代码,以便我可以联系 MUX API 并检索有关我的资产 ID 的请求信息?

编辑:我很感谢下面的答案指出应该使用签名密钥而不是 API 凭据,但是,抛开我对为什么我们需要像签名密钥这样的东西的困惑,curl 请求创建一个签名密钥也不起作用。这个 curl 请求(我已经修改了我的 MUX_TOKEN_ID 和 MUX_TOKEN_SECRET):

curl -X POST \
-H "Content-Type: application/json" \
-u <MUX_TOKEN_KEY>:<MUX_TOKEN_SECRET> \
'https://api.mux.com/system/v1/signing-keys?product=data'

失败,返回此错误:

{"error":{"type":"not_found","messages":["The requested resource either doesn't exist or you don't have access to it."]}}

【问题讨论】:

    标签: php firebase api openssl jwt


    【解决方案1】:

    这里是 Jared Smith,Mux 的社区工程师之一。让我看看我是否可以帮助解决这个问题。该指南中的措辞有点不清楚,我将在内部工作以清理它,但我想我知道这里的混乱之处。

    在我看来,您正在传递 $keyId 的 API 令牌 ID 和 $keySecret 的 API 令牌秘密。

    相反,您应该首先调用 API 的 /system/v1/signing-keys 端点(使用您的令牌 ID 和密码,如that guide第一步中所述)创建一个签名密钥。

    然后您将签名密钥 ID 作为 $keyId 传递,并将 base 64 编码的 签名密钥 本身作为 $keySecret 传递。

    另一个可以用来确保您拥有正确的签名密钥的测试是对它进行 base 64 解码,并确保它以 -----BEGIN RSA PRIVATE KEY----- 开头并以 -----END RSA PRIVATE KEY----- 结尾。

    希望这可以为您解决问题。如果没有,请随时寻求更多帮助!

    【讨论】:

    • 感谢您的回复。是的,我使用的是 API 密钥,但是我尝试了指定的 curl 请求来创建签名密钥,但也失败了。我已经编辑了我的问题,以便在最后提供更多详细信息。
    【解决方案2】:

    您似乎正在尝试使用 API 密钥和秘密来签署 JWT。 Mux 正在寻找单独的签名密钥

    可以使用您当前在对https://api.mux.com/system/v1/signing-keys?product=data的请求中使用的 API 密钥和秘密生成此签名密钥

    您可以在此处查看此请求的示例:https://docs.mux.com/guides/data/see-how-many-people-are-watching#1-create-a-signing-key

    JWT 声明的 kid 值将改为设置为创建签名密钥时返回的密钥 ID。

    我是一名与 Mux 合作的社区工程师 - 如果您对如何让这个过程更清晰有任何想法,请随时提供任何反馈!

    【讨论】:

    • 感谢您的回复。我的第一个困惑点是为什么我们需要在我们的 api 密钥之上有一个“签名密钥”之类的东西。其次,在 mux 文档中描述的创建签名密钥的 CURL 请求也不起作用。我已经编辑了我的原始帖子以在最后指定更多细节。
    • @S.Imp 我和我的队友 Ashley 核实过——这通常发生在 API 密钥没有生成签名密钥的正确权限时。确保您使用的 API 密钥已检查所有权限(视频、数据、系统),以便能够调用该 cURL 请求以获取签名密钥。您可以在本指南中参考以下示例:mux.com/blog/…
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 2022-10-13
    • 2018-08-29
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多