Получить токен от Github API

Я вручную создал токен в Github -> Settings -> Personal access tokens -> Generate new token и выбрал только repo scope.

Этот токен прекрасно работает, поэтому с ним я могу вдаваться в организацию. У меня есть привилегии write.

Затем я хочу сделать то же самое (получить access_token) на github-api.

params = dict(client_id=client_id,
              client_secret=client_secret,
              code=code)

url = url_concat("https://github.com/login/oauth/access_token", params)

req = HTTPRequest(url,
                  method="POST",
                  headers={"Accept": "application/json"},
                  body="") 

В результате у меня есть json:

{
    'scope': 'repo',
    'token_type': 'bearer',
    'access_token': 'xxxxxxxx10755fbb6c281e92902ed122144886c5'
}

Это все правильно, но я не могу вдаваться в репозиции организации, где у меня есть привилегии write. Я могу нажать только на свои собственные репозитории.

Не могли бы вы помочь? Любая идея, где ошибка или неточность, приветствуется.

Ответ 1

Итак, если вы хотите сделать это через GitHub API, ваш запрос должен измениться.

Сначала вам нужно использовать /authorizations конечную точку следующим образом:

POST /authorizations
Authorization: Basic ...
Content-Type: application/json
Content-Length: ...

{
  "scopes": [
    "repo",
    "write:org"
  ],
  "note": "Example from StackOverflow by @sigmavirus24",
  "client_id": "Your client_id here",
  "client_secret": "Your client_secret here",
  "fingerprint": "1234",
}

Затем он должен вернуть ответ 201 Created с таким телом:

{
  "id": 72249124,
  "url": "https://api.github.com/authorizations/72249124",
  "scopes": [
    "repo",
    "write:org"
  ],
  "token": "abcdefgh12345678",
  "token_last_eight": "12345678",
  "hashed_token": "25f94a2a5c7fbaf499c665bc73d67c1c87e496da8985131633ee0a95819db2e8",
  "app": {
    "url": "http://my-github-app.com",
    "name": "my github app",
    "client_id": "abcde12345fghij67890"
  },
  "note": "optional note",
  "note_url": "http://optional/note/url",
  "updated_at": "2017-02-08T20:39:23Z",
  "created_at": "2017-02-08T17:26:27Z",
  "fingerprint": "1234"
}

Кроме того, это будет реально.

Тем не менее, похоже, что вы пытаетесь использовать конечную точку, которая позволяет использовать GitHub в качестве поставщика проверки подлинности. Другими словами, вы создаете приложение, которое позволяет пользователям выполнять вход в GitHub. В этом случае вам нужно специально выполнить поток веб-приложений для OAuth.

В этом случае вы являетесь частью пути, но вы отправляете неправильные параметры.

Сначала вы делаете запрос GET:

GET https://github.com/login/oauth/authorize?client_id=<your-client_id>&scopes=repo%20write:org&state=something-random

Затем вы получите данные от GitHub, которые вы должны использовать в своем POST

POST https://github.com/login/oauth/access_token?client_id=<your-client_id>&client_secret=<your-client_secret>&code=<code-from-github>
Accept: application/json

После этого любой сделанный вами запрос должен иметь

Authorization: token <token-received-in-response-to-POST>

Ура!

Ответ 2

используйте POST с URL-адресом https://api.github.com/authorizations, передавая значения client_id и client_secret в базовой авторизации авторизации. Отправьте оставшиеся параметры в формате json в теле как raw. например:

{ "scopes": [ "repo", "write:org" ], "note": "Sample Access Token using API Call", "fingerprint": "DEMO#[email protected]" }

{"scopes": ["repo", "write: org"], "note": "Пример токена доступа с использованием вызова API", "fingerprint": "DEMO # $ 12 @A"}