Я хочу получить токен доступа с моего сервера django, используя код авторизации. Это работает, когда я указываю client_id и client_secret в параметрах запроса, но когда я передаю их с помощью Basic Auth, сервер отвечает об ошибке.
У меня есть сервер django, использующий django-oauth-toolkit для реализации аутентификации OAuth2. Поток кода авторизации работает гладко, но я хочу реализовать его с помощью базовой аутентификации для аутентификации клиента.
Клиентское приложение добавлено в админ панель django.
И сервер, и клиент мои, но для будущей совместимости со сторонним API мне нужно реализовать базовую аутентификацию для клиентского приложения при получении токена доступа.
На стороне клиента, отправка запроса с информацией о клиенте в параметрах дает мне токен доступа, но передача информации в HTTPBasicAuth выдает ошибку.
import base64
import json
from urllib.parse import urlencode
import requests
MY_APP_CLIENT_ID = 'my_client_id'
MY_APP_CLIENT_SECRET = 'my_client_secret'
print('input authorization code:')
oauth_code = input()
headers = {
'Content-Type': "application/x-www-form-urlencoded",
}
encoded_payload = urlencode({
'grant_type': 'authorization_code',
'code': oauth_code,
'redirect_uri': 'http://localhost/my_app/oauth2/redirect_uri',
'client_id': MY_APP_CLIENT_ID,
'client_secret': MY_APP_CLIENT_SECRET
})
response = requests.post('http://localhost:8000/o/token/', data=encoded_payload, headers=headers)
print(response.status_code) # 200
print(response.json()) # {'access_token': 'JEDsAwRh', 'expires_in': 36000, 'token_type': 'Bearer', 'scope': 'my_scope', 'refresh_token': '4TD9gmjb'}
encoded_payload = urlencode({
'grant_type': 'authorization_code',
'code': oauth_code,
'redirect_uri': 'http://localhost/my_app/oauth2/redirect_uri',
})
response = requests.post('http://localhost:8000/o/token/', data=encoded_payload, headers=headers, auth=(MY_APP_CLIENT_ID, MY_APP_CLIENT_SECRET))
print(response.status_code) # 401
print(response.json()) # {'error': 'invalid_client'}
Первый случай дает мне статус 200
и {'access_token': 'JEDsAwRh', 'expires_in': 36000, 'token_type': 'Bearer', 'scope': 'my_scope', 'refresh_token': '4TD9gmjb'}
в качестве ответа, как и ожидалось.
Второй случай дает мне статус 401
и {'error': 'invalid_client'}
Код моего клиента неверный?
Согласно https://tools.ietf.org/html/rfc6749#section-2.3, сервер OAuth2 должен реализовывать аутентификацию клиента с помощью Basic Auth, но реализует ли это Django? Есть ли особые настройки на стороне сервера?