2017-01-26 39 views
9

Ręcznie utworzyłem token w wersji Github -> Settings -> Personal access tokens -> Generate new token i wybrałem tylko reposcope.Uzyskaj token za pomocą Github API

Ten token działa poprawnie, więc dzięki niemu mogę wcisnąć w organizację uprawnienia write.

Następnie chcę zrobić to samo (uzyskać kod dostępu) przez 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="") 

W rezultacie mam taki json:

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

To jak wszystko poprawne, ale nie mogę wcisnąć do repo organizacji, w której mam write przywileje. Mogę wcisnąć tylko moje własne repozytorium.

Czy możesz pomóc? Każdy pomysł, gdzie jest błąd lub niedokładność jest mile widziany.

+0

Twoje pytanie jest bardzo nieprecyzyjne. W mojej odpowiedzi zamieściłem dwa możliwe rozwiązania. Jeśli nie są poprawne, * musisz * zaktualizować pytanie, ponieważ jest zbyt mało szczegółów. –

+0

Roma, czy możesz rzucić okiem na moją odpowiedź i dać mi znać, jeśli masz inne pytania? –

Odpowiedz

6

Jeśli chcesz to zrobić przez interfejs API GitHub, Twoje żądanie musi się zmienić.

Najpierw trzeba być pomocą /authorizations endpoint jak tak:

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", 
} 

ta powinna następnie powrócić odpowiedź 201 Created z ciałem tak:

{ 
    "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" 
} 

oprócz tego, że będzie prawdziwy.

To powiedziawszy, wydaje się, że próbujesz użyć punktu końcowego, który pozwala GitHub być używany jako dostawca uwierzytelniania. Innymi słowy, tworzysz aplikację, która pozwala użytkownikom logować się za pomocą GitHub. W takim przypadku musisz dokładnie postępować zgodnie z Web Application Flow for OAuth.

W takim przypadku jesteś częścią drogi, ale wysyłasz nieprawidłowe parametry.

Najpierw trzeba złożyć wniosek otrzymujemy:

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

Wtedy będziesz otrzymywać dane z powrotem z GitHub, które należy wykorzystać w swoim poście

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 

Po tym, każdy wniosek zrobić musi mieć

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

Pozdrawiam!

+0

Witam, jestem trochę zdezorientowany. Czy nie potrzebowalibyśmy wszystkich zakresów do wykonania żądania POST dla nowego tokena o określonym zakresie. W jaki sposób utworzyć system, w którym pyta się o pozwolenie na e-mail podczas pierwszej rejestracji i kiedy użytkownik próbuje obejrzeć repo, wtedy autoryzacja zakresu repo jest wymagana od użytkownika. czego mi brakuje? –