Код: Выделить всё
def mal_callback(request):
code = request.GET.get('code')
code_verifier = request.session.get('code_verifier')
if not code or not code_verifier:
return redirect('/error/')
# Prepare credentials and payload for token exchange
credentials = f"{settings.MAL_CLIENT_ID}:{settings.MAL_CLIENT_SECRET}".encode('utf-8')
encoded_credentials = base64.b64encode(credentials).decode('utf-8')
token_data = {
'grant_type': 'authorization_code',
'client_id': settings.MAL_CLIENT_ID,
'code': code,
'redirect_uri': settings.REDIRECT_URI,
'code_verifier': code_verifier,
}
try:
token_response = post(
'https://myanimelist.net/v1/oauth2/token',
headers={
'Authorization': f'Basic {encoded_credentials}',
'Content-Type': 'application/x-www-form-urlencoded'
},
data=token_data
)
token_response.raise_for_status()
token_response_json = token_response.json()
except Exception as e:
print(f"Error retrieving tokens: {e}")
return redirect('/error/')
if 'error' in token_response_json:
print(f"Token error: {token_response_json['error']}")
return redirect('/error/')
access_token = token_response_json.get('access_token')
refresh_token = token_response_json.get('refresh_token')
# Retrieve user info from MAL
try:
user_info_response = get(
'https://api.myanimelist.net/v2/users/@me',
headers={'Authorization': f'Bearer {access_token}'}
)
user_info_response.raise_for_status()
user_info_json = user_info_response.json()
except Exception as e:
print(f"Error retrieving user info: {e}")
return redirect('/error/')
username = user_info_json.get('name')
if not username:
return redirect('/error/')
# Create or get user and external user records
user, created = User.objects.get_or_create(username=username)
expires_in = token_response_json.get('expires_in')
expires_at = datetime.now() + timedelta(seconds=expires_in) if expires_in else None
external_user, _ = ExternalUser.objects.update_or_create(
user=user,
defaults={
'provider': 'MAL',
'access_token': access_token,
'refresh_token': refresh_token,
'token_expires_at': expires_at,
}
)
login(request, user)
return redirect('/')
Изменить: когда я запустите этот код, я буду перенаправлен на «/error/», поскольку это то, что настроено, если возникает какая-либо ошибка, и я не перенаправляюсь на свой «/», как предполагалось
Подробнее здесь: https://stackoverflow.com/questions/791 ... -url-https