Плохие учетные данные для JWT для API интеграции GitHub


Я зарегистрировал интеграцию с GitHub и загрузил закрытый ключ RSA (файл PEM). В моем PHP-скрипте я использую эту библиотеку для кодирования моего токена следующим образом:

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 и попытался получить доступ API GitHub выглядит следующим образом:

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

Однако ответ JSON от GitHub таков:

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

Я подозревал, что это не удается, потому что API-интерфейс GitHub zen неприменим к токенам интеграции, но, похоже, проблема не в этом. В частности, в сообщении говорится, что это плохие учетные данные. Но я уже выполнил все шаги, описанные в документации на GitHub. Я неправильно пишу PHP-скрипт?

Author: SOFe, 2016-09-20

1 answers

Я провел последние три дня, ударяясь головой о 401 неверный ответ на учетные данные.

Только что запустив его, я могу сказать вам, что ваше первоначальное предположение было правильным: если конечная точка не настроена для интеграции, то вы получите 401 обратно.

Еще одна вещь, которую вы должны проверить, это то, что время, которое вы отправляете, является целым числом. Отправка поплавков приведет к 401. (Я использую Python, и у класса datetime нет метода для преобразования в эпоху Unix, поэтому я написал свой собственный, который возвращал доли секунды)

Итак: попробуйте свой существующий код с конечной точкой, которая задокументирована как включенная для интеграции, и вы, вероятно, обнаружите, что она работает.

Помните, что ваш первый запрос должен быть на GET /integration/installations с заголовком Authorization: Bearer $JWT

Затем прочитайте access_tokens_url из ответа и ОТПРАВЬТЕ на этот URL-адрес тот же заголовок авторизации, что и в последнем запросе. (Если ваша интеграция включена для более чем одной установки, то у вас будет более одной URL)

Затем вы получите поле token в ответе, после чего вам следует изменить заголовок так, чтобы он Authorization: token $TOKEN.

Вы также получаете время истечения срока действия, отправленное обратно с токеном доступа, который вы должны сохранить, чтобы при необходимости вы могли повторно пройти аутентификацию.

 3
Author: Aaron F, 2016-10-13 20:23:56