2016-04-19 2 views
3

Для проекта кто-то дал мне эти данные, которые я использовал в Почтальон для целей тестирования:Как я могу получить oauth2 access_token с помощью Python

В Почтальон это работает отлично. URL

Auth: https://api.example.com/oauth/access_token
Токен доступа URL: https://api.example.com/access_token
клиент ID: ABCDE
клиента секрет: 12345
Токен Имя: access_token
Grant Тип: учетные данные клиента

Все, что мне нужно, чтобы вернуться это токен доступа.

Один я получил токен доступа, который я могу продолжить.

Я уже пробовал несколько пакетов Python и некоторый собственный код, но почему-то эта, казалось бы, простая задача начинает создавать настоящую головную боль.

Один Exemple я попробовал:

import httplib 
import base64 
import urllib 
import json 

def getAuthToken(): 
    CLIENT_ID = "abcde" 
    CLIENT_SECRET = "12345" 
    TOKEN_URL = "https://api.example.com/oauth/access_token" 

    conn = httplib.HTTPSConnection("api.example.com") 

    url = "/oauth/access_token" 

    params = { 
     "grant_type": "client_credentials" 
    } 

    client = CLIENT_ID 
    client_secret = CLIENT_SECRET 

    authString = base64.encodestring('%s:%s' % (client, client_secret)).replace('\n', '') 

    requestUrl = url + "?" + urllib.urlencode(params) 

    headersMap = { 
     "Content-Type": "application/x-www-form-urlencoded", 
     "Authorization": "Basic " + authString 
    } 

    conn.request("POST", requestUrl, headers=headersMap) 

    response = conn.getresponse() 

    if response.status == 200: 
     data = response.read() 
     result = json.loads(data) 

     return result["access_token"] 

Тогда я получил это один:

import requests 
import requests.auth 

CLIENT_ID = "abcde" 
CLIENT_SECRET = "12345" 
TOKEN_URL = "https://api.example.com/oauth/access_token" 
REDIRECT_URI = "https://www.getpostman.com/oauth2/callback" 

def get_token(code): 
    client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET) 
    post_data = {"grant_type": "client_credentials", 
       "code": code, 
       "redirect_uri": REDIRECT_URI} 
    response = requests.post(TOKEN_URL, 
          auth=client_auth, 
          data=post_data) 
    token_json = response.json() 
    return token_json["access_token"] 

Если это будет работать, что я должен положить в параметр code

Я действительно надеюсь, кто-то может помочь мне здесь.

Заранее спасибо.

ответ

2

я, наконец, смог сделать это

Это код, который я использовал:

class ExampleOAuth2Client: 
    def __init__(self, client_id, client_secret): 
     self.access_token = None 

     self.service = OAuth2Service(
      name="foo", 
      client_id=client_id, 
      client_secret=client_secret, 
      access_token_url="http://api.example.com/oauth/access_token", 
      authorize_url="http://api.example.com/oauth/access_token", 
      base_url="http://api.example.com/", 
     ) 

     self.get_access_token() 

    def get_access_token(self): 
     data = {'code': 'bar', 
       'grant_type': 'client_credentials', 
       'redirect_uri': 'http://example.com/'} 

     session = self.service.get_auth_session(data=data, decoder=json.loads) 

     self.access_token = session.access_token 
+1

Может вы, пожалуйста, объясните свой код немного? Кажется, я не могу заставить его работать. Заранее спасибо! – Rhyuk

0

Просто (в случае Facebook Authentication):

import requests, json 

access_token = requests.get("https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id=your_client_id&client_secret=your_client_secret").json()["access_token"] 

Или вы можете использовать rauth library.

В docs есть интересный пример с facebook oauth2 аутентификации:

from rauth import OAuth2Service 

facebook = OAuth2Service(
client_id='your_client_id', 
client_secret='your_client_secret', 
name='facebook', 
authorize_url='https://graph.facebook.com/oauth/authorize', 
access_token_url='https://graph.facebook.com/oauth/access_token', 
base_url='https://graph.facebook.com/') 

и после открытой сессии:

session = facebook.get_auth_session(data={'code': 'foo','redirect_uri': redirect_uri}) 

в сессии JSON есть ваш доступ лексема