Python OAuth 2.0 app
caution
If you are developing a single-page, mobile or native application, make sure you can ensure Client Secret privacy.
See OAuth documentation for more details.
tip
This page contains OAuth client code sample only. For more details about the OAuth authorization check related article.
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()