GitHub 集成 API 的 JWT 错误凭据

Posted

技术标签:

【中文标题】GitHub 集成 API 的 JWT 错误凭据【英文标题】:Bad credentails for JWT for GitHub Integrations API 【发布时间】:2017-01-28 18:00:27 【问题描述】:

我注册了GitHub integration 并下载了 RSA 私钥(PEM 文件)。在我的 php 脚本中,我使用this library 对我的令牌进行编码,以这种方式:

use Firebase\JWT\JWT;

$token = [
        "iat" => time(),
        "exp" => time() + 3600,
        "iss" => $my_integration_id
];
$key = file_get_contents($path_to_pem_file);
echo JWT::encode($token, $key, "RS256");

PEM文件是这样的(我已经重新生成了私钥):

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA1bT61yW2fo4SI6TZXo+3dsyyxitcsw0kdhoGufsEkgdqbpeF
2/TfJtwYj9Veq11LNHuyoYk51DxUIyoC2Ul45E/s9kOw+qjXDJAOf3z9kq+obcOL
145ivQwsRF8bB1MQf8YsE/jAhVdxdIfRbw4UG8Fn0RPce/WQ18RI7Li4xfM138RP
2MQhZsx289ale7n+OtDzzajC4oj9qlaNFFKpSuCVGf6fqnktCOoFu1+ouB/+u3oc
eneS/qmSxwI7N7MrxOTnoHqhxIiatNFisK85Anc/WZ9duWS9i88GhtK86YMaWnCj
5nodzFwSF6SzBS+iOrI2AJennOTjsOrtjjQXzQIDAQABAoIBAQDKVhoRTfGljRn7
iX8NGwFXh6PUIQYZuN3GvAmWWOYQ5NiOcQQaJ5SIlGbk9940XZZw0JVmgCiym5QF
3ybnV7sQX+Q5ngmYqfdCO7qeVlc3ZP0RP83Nf1BZMYdQDMPogWrjr1vYZPLSzOHs
tRNEFI5RYSLMQAPHkc9bmsp45sR7FXj+tZEjM3NkcF4n8Jud/ARVAX/tzOWfF6A4
rhtGJfqYCvEF69J/dsHyy28egawrTxqPd6d1BKLdOh05xHkFL26wtgJWpHcNAZNZ
DUZs0Twe6Cw3XYQtlUD6D5mkj3zzh5hZ4xsoKftNfD2ZA1N0RVks0j5wrUjPI6jV
bVDRvvbBAoGBAPp2yjhTuchwpVOcGVYnqF1jVgXssSYdiydUglKtxzhta7c23xqK
v5B/cWdsz8mIKFmOcjr97GFUT8K6sZG77im05gDBCV7YuIMwekNmZ3m1MqUWtiZY
sEqCarIYPzQk9iPPxyZrmOVL/5KqlgRj9YmYFzjLpfnaxvk4rIMyVF21AoGBANpu
NLw7LfufPeSbIkSIeZ6X1ndspuZDzWVjgi0hmVdozMwxT1wmfoinJ27gxhKStwmG
9kbYE4QbGBSAlkJqoSf8QWVIH+/Qq9/9mbi1T4p+AgJSYiz1voOGnOk0RoJku6Zn
9XkcGXCUh5ckxWyYbXjHqBqHTXHeJzk9zoRfBuC5AoGBAI1/yPUTkBUGVtCqksHS
u9KuyS2lr9spu7DnlIzjMnbVkpI6hMa49krLRSU6GxXvP2SBDlX3mLDP8hPAZ4s+
0elsErkAVavo4izzmU80rmbbEJamAxgc6NPfZCnjeumZrBlFTGyPQxzf165jg0dN
ta0baJskqktC50BrXULtjy41AoGANa4j06aPlGj8IvRlJYaMrQcPs+XF1o0PKz2b
PlAliS++NOhhYnorWpYJwNwIkYPw66x5VcvAcBTghBld1BC0bkk2IRfqkVstAi0m
3Bfi5lw1TjDE49u46EXqxf0M3vq2ixy9XPgk4GAAOorU4e1L6gTXMT3TMIqyBQVF
fY6E+DECgYEA22HhPud5KLAX6drbMEe54uttiUrs/K3nft/xTYWU1BIG9r/HPKQh
3OWD/Dknek+i5hW89OOROPaUmnjaTR3/ARAxTlpxDdBWKu2mCXS/LcdEWdy7teEu
dDbqqotO4jmTh94FVWgVLDVVmrVSp++fwstI6foPGPABlbsrJxyGUsc=
-----END RSA PRIVATE KEY-----

我将整个字符串传递给JWT::encode,并得到以下输出:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE0NzQzOTI0NjQsImV4cCI6MTQ3NDM5NjA2NCwiaXNzIjoyMDF9.ZodSJyrq_SJfLTx4ifnCRWC9cbX1NmqOY3bADcuU7Wc18oZnH3EtZErvLgW6-reuR1-flsNbrji2dL9Zsm3rE-1FtEambcs1Xxynz3PE42yFMimQ5WyiAHdJhbh8-fB0hLIxn2I0oBiJbpZp92Rm2E2xxA1m4lmAubatY0JDR3FS4MmjR-pOZRbkgA4QwaTb0Q7R0tSUaoJo1ETLZoApp5ofsyt5hciB7wogTigA08H4r8TBUuSY4LeHWX9IfmDqHh5gVLDHhFXuLp1Qfm-8ltnLMgcelTmA9QE9NxxVcHQtYvNnE-EvXsh04Oqiyg51eq5cDoc4wA_WhTB4w-9NWg

我将这个输出(没有尾随换行符,我可以确认)存储到 Bash 变量 $JWT,并尝试像这样访问 GitHub API:

curl -i -H "Accept: application/vnd.github.machine-man-preview+json"\
        -H "Authorization: Bearer $JWT" https://api.github.com/zen

但是,来自 GitHub 的 JSON 响应是:


  "message": "Bad credentials",
  "documentation_url": "https://developer.github.com/v3"

我怀疑它失败了,因为 GitHub API zen 不适用于集成令牌,但这似乎不是问题。特别是,消息说它是错误的凭据。但我已经按照GitHub documentation 中的所有步骤进行了操作。我是不是写错了 PHP 脚本?

【问题讨论】:

除了加密之外,我不是这方面的专家,但我仔细阅读了文档,你所做的一切看起来都是正确的。也许您有多个集成 ID 和私钥,但您没有将正确的私钥与其集成 ID 匹配? 据我所知,知道这个令牌纯粹是从私钥生成的,所以我怀疑情况是否如此。确实我怀疑这是我选择的 URL 的问题,但不太可能。 【参考方案1】:

在过去的三天里,我一直在对 401 错误凭据响应进行抨击。

刚刚开始工作,我可以告诉您,您最初的假设是正确的:如果没有为集成设置端点,那么您将得到 401 回复。

您应该检查的另一件事是您发送的时间是整数。发送浮点数将导致 401。 (我使用的是 Python,并且 datetime 类没有转换为 Unix 纪元的方法,所以我自己编写了返回几分之一秒的方法)

因此:针对记录为已启用集成的端点尝试现有代码,您可能会发现它有效。

请记住,您的第一个请求应该是GET /integration/installations,标头为Authorization: Bearer $JWT

然后从响应中读取access_tokens_url,并使用与上一个请求相同的授权标头 POST 到该 URL。 (如果您的集成启用了多个安装,那么您将拥有多个 URL)

然后您将在响应中获得一个token 字段,此时您应该修改标头使其为Authorization: token $TOKEN

您还会收到与访问令牌一起发回的过期时间,您应该将其存储起来,以便在必要时重新进行身份验证。

【讨论】:

以上是关于GitHub 集成 API 的 JWT 错误凭据的主要内容,如果未能解决你的问题,请参考以下文章

即使凭据为真,Spring Boot Security 也会在 API 调用上引发 401 身份验证错误

Spring Security JWT - 400 错误请求:“无效授权”“错误凭据”

使用 JWT 获取令牌而不尝试用户凭据 Laravel?

Django Rest Framework JWT 未提供身份验证凭据

Django Rest Framework JWT“未提供身份验证凭据。”

Kong 和 JWT - API 应如何从令牌中提取信息