Перейти к основному содержимому

Приложение OAuth 2.0 на Python

предупреждение

Если Вы разрабатываете SPA, мобильное или нативное приложение — убедитесь, что можете обеспечить конфиденциальность Client Secret.

Подробнее о причинах — в документации OAuth.

подсказка

Данная страница содержит только образец кода OAuth-клиента. Подробнее о способе авторизации через OAuth-сервис читайте в соответствующей статье.

from requests_oauthlib import OAuth2Session
import webbrowser
import io
import http.server
import socketserver
import urllib.parse
from http.server import HTTPServer, BaseHTTPRequestHandler
import json

# Параметры ниже заполняются значениями из https://devs.inviabroker.com/myapps
# Идентификатор клиентского приложения. Считается публичной информацией
client_id = "d8d...ce7"
# Секретный ключ клиентского приложения. Считается приватной информацией
client_secret = "4s7...40="

# Адрес ресурса, к которому клиентское приложение направит пользователя для ввода его учётных данных
# Ниже указан адрес для боевого контура системы, для тестового контура используйте https://oauthdev.inviabroker.com/authorize
authorization_base_url = 'https://oauth.inviabroker.com/authorize'
# Адрес ресурса, к которому клиентское приложение будет обращаться для генерации токенов при успешной авторизации пользователя
# Ниже указан адрес для боевого контура системы, для тестового контура используйте https://oauthdev.inviabroker.com/token
token_url = 'https://oauth.inviabroker.com/token'
# Адрес страницы клиентского приложения, на которую пользователь будет перенаправлен после успешной авторизации
# Адрес должен совпадать с указанным на странице https://devs.inviabroker.com/myapps
redirect_uri = 'http://localhost:3002/callback'


# Перечень разрешений, запрашиваемых приложением по умолчанию
# Пользователь может изменить список фактически предоставленных приложению разрешений на странице авторизации
scope = [
'ordersread', 'trades', 'personal'
]

invia = OAuth2Session(client_id, scope=scope, redirect_uri=redirect_uri)

authorization_url, state = invia.authorization_url(authorization_base_url)

webbrowser.open(authorization_url)

class CallbackHandler(BaseHTTPRequestHandler):
def do_GET(self):
o = urllib.parse.urlparse(self.path)
data = urllib.parse.parse_qs(o.query)
code = data['code'][0]
tokens = invia.fetch_token(token_url, code=code, client_secret=client_secret, include_client_id=True)
print(tokens)
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(tokens).encode('utf-8'))

PORT = 3002
httpd = HTTPServer(('localhost', PORT), CallbackHandler)
httpd.serve_forever()