2016-09-20 101 views
3

我注册了GitHub integration并下载了RSA私钥(PEM文件)。在我的PHP脚本,我使用this library编码我的道理,以这样的方式JWT for GitHub集成API的缺陷credentails API

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 

我存储这个输出(无拖尾换行,我可以证实)成猛砸变量$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禅并不适用于集成令牌,但这似乎不是问题。特别是,该消息表示它是错误的凭据。但我已经遵循GitHub documentation中的所有步骤。我是否错误地编写了PHP脚本?

+0

我不是这方面的专家,除了加密,但我仔细阅读了文档,你所做的一切看起来都是正确的。也许你有多个集成ID和私钥,你没有通过它的集成ID匹配正确的私钥? –

+0

据我所知,知道这个令牌纯粹是从私钥生成的,所以我怀疑是这种情况。事实上,我怀疑这是我选择的URL的问题,但这不太可能。 – SOFe

回答

2

我已经花了三天的时间来对抗401凭证不良反应。

刚刚得到它的工作,我可以告诉你,你最初的假设是正确的:如果端点没有设置为集成,那么你会得到一个401回。

你应该检查的另一件事是你发送的时间是整数。发送花车将导致401. (我正在使用Python,并且datetime类没有转换为Unix纪元的方法,所以我写了自己的回复小部分秒)

所以:尝试针对已记录为启用集成的端点尝试您的现有代码,并且您可能会发现它的工作原理。

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

然后从响应读access_tokens_url,产后用相同的授权头作为最后一个请求的URL。 (如果您的集成为一个以上的安装启用,那么你将有多个URL)

然后你会在响应得到token场,在这一点上,你应该修改标题,以便它的Authorization: token $TOKEN

您还会获得使用访问令牌发回的到期时间,您应该存储该访问令牌,以便在必要时重新进行身份验证。