Получить токен через 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 привилегии. Я могу нажать только в свои собственные репозитории.

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


person Kenenbek Arzymatov    schedule 26.01.2017    source источник
comment
Ваш вопрос очень расплывчатый. Я опубликовал два возможных решения в своем ответе. Если они неверны, вам на самом деле придется обновить свой вопрос, потому что в нем слишком мало деталей.   -  person Ian Stapleton Cordasco    schedule 08.02.2017
comment
Рома, можешь взглянуть на мой ответ и сообщить, если у тебя есть другие вопросы?   -  person Ian Stapleton Cordasco    schedule 14.02.2017


Ответы (2)


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

Сначала вам нужно использовать /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>

Ваше здоровье!

person Ian Stapleton Cordasco    schedule 08.02.2017
comment
Привет, я немного запутался здесь. Разве нам не потребуются все области действия для выполнения POST-запроса нового токена с определенной областью действия. Как можно создать систему, в которой при первой регистрации запрашивается только разрешение по электронной почте, и когда пользователь пытается просмотреть репо, тогда у пользователя запрашивается авторизация области репо. Что мне не хватает? - person Dhiraj Barnwal; 19.03.2017

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

{
  "scopes": 
    [
      "repo",
      "write:org"
    ],
  "note": "Sample Access Token using API Call",
  "fingerprint": "DEMO#$12@A"
}
person SuKu    schedule 02.12.2018