Python – OAUTH2 Как получить токен доступа с помощью PCKE?Python

Программы на Python
Ответить
Anonymous
 Python – OAUTH2 Как получить токен доступа с помощью PCKE?

Сообщение Anonymous »

Я пытаюсь получить этот токен доступа с помощью Python. С помощью Postman я могу получить токен доступа. После настроек на скриншотах я нажимаю кнопку «Получить токен доступа», и появляется всплывающее окно с именем пользователя и паролем. Потом я их заполняю. После этого я смогу получить токен доступа от Postman.
Изображение

Изображение

Чтобы получить доступ токен с Python, я написал код ниже. В первом запросе на получение я получаю файлы cookie и URL-адрес перенаправления (для публикации учетных данных пользователя). Затем я отправляю учетные данные пользователя и файлы cookie на перенаправленный URL-адрес. После этого заголовок ответа["location"] должен включать параметр кода для получения токена. Но параметр заголовка не имеет параметра кода. Он имеет URL-адрес авторизации с параметрами запроса. Как получить этот параметр кода? Наконец, я отправлю запрос (к URL-адресу токена) с этим кодом, чтобы получить токен доступа в теле ответа.

Код: Выделить всё

import base64
import hashlib
import json
import os
import re
import urllib.parse
import requests
from bs4 import BeautifulSoup
from rich import print

username = 'username '
password = 'password '
client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
client_secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyy'
prod_url = 'https://url:port'
callback_url = prod_url + '/main/ifsapplications/projection/oauth2/callback'
authorization_url = prod_url + '/openid-connect-provider/idp/authorization'
token_url = prod_url + '/openid-connect-provider/idp/token'
code_challenge_method = "S256" #SHA-256
scope = 'openid'
response_type ='code'
#Add auth data to request headers
#Grant type = authorization code with pkce
#send client credentials in body

code_verifier = base64.urlsafe_b64encode(os.urandom(40)).decode('utf-8')
code_verifier = re.sub('[^a-zA-Z0-9]+', '', code_verifier)
code_challenge = hashlib.sha256(code_verifier.encode('utf-8')).digest()
code_challenge = base64.urlsafe_b64encode(code_challenge).decode('utf-8')
code_challenge = code_challenge.replace('=', '')
resp = requests. Get(
url=authorization_url,
params={
"response_type": response_type,
"client_id": client_id,
"scope": scope,
"redirect_uri": callback_url,
"code_challenge": code_challenge,
"code_challenge_method": code_challenge_method,
},
allow_redirects=False
)
cookie = resp.headers['Set-Cookie']
cookie = '; '.join(c.split(';')[0] for c in cookie. Split(', '))

soup = BeautifulSoup(resp.text, 'html.parser')
form_action = soup. Find('a').text

resp = requests. Post(
url=form_action,
data={
"username": username,
"password": password
},
headers={"Cookie": cookie,
"Referer": form_action},
allow_redirects=False
)

redirect = resp.headers['Location']

print(resp.text)
print(resp.headers)
ВЫВОД:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/738 ... using-pcke
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»