oauth1.0 с именем пользователя и паролем в Python
Я пытаюсь интегрировать API qwikcilver в мой проект. Они используют oauth1.0 для аутентификации. Я использую lib -запросы Python для oauthlib для oauth1.0.
Вот мой код для аутентификации.
# Using OAuth1Session
oauth = OAuth1Session(client_key, client_secret=client_secret)
fetch_response = oauth.fetch_request_token(request_token_url)
{
"oauth_token": "Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hhlSLik",
"oauth_token_secret": "Kd75W4OQfb2oJTV0vzGzeXftVAwgMnEK9MumzYcM"
}
resource_owner_key = fetch_response.get('oauth_token')
resource_owner_secret = fetch_response.get('oauth_token_secret')
Мой запрос выглядит следующим образом,
qwikcilver имеет имя пользователя и пароль. Я пытался много, чтобы отправить имя пользователя и пароль в коде, но не работает.
Как передать имя пользователя и пароль в функцию request-oauthlib request?
2 ответа
Я добавляю пример с телом сообщения. Это простой пример использования запроса/сообщения с шаблоном "Обычный старый XML" (POX):
from requests_oauthlib import OAuth1Session
CONSUMER_KEY = "xxxxxxx"
CONSUMER_SECRET = "xxxxxxx"
ourSession = OAuth1Session(CONSUMER_KEY, client_secret=CONSUMER_SECRET, force_include_body=True)
body= '<?xml version="1.0" encoding="UTF-8"?>' \
'<POXEnvelopeRequest xmlns="http://whateve">' \
'<POXHeader>' \
' <RequestHeaderInfo>' \
. . . .
' </RequestHeaderInfo>' \
'</POXHeader>' \
'</POXEnvelopeRequest>'
clen = str(len(body))
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Host': 'X.Y.com',
'Content-Type': 'application/xml',
'Connection': 'keep-alive',
'Content-Length': clen
}
r = ourSession.post(url, headers=headers, data=body, verify=False)
# DEBUG: Comment out in and out as needed...
print("===================== B E G I N R E S P O N S E =======================\n")
print(r)
print(r.text)
print("===================== E N D of R E S P O N S E =======================\n")
Проверьте с помощью qwikcilver (что бы это ни было), есть ли у них возможность генерировать токен и авторизоваться. Если это так, вы можете использовать токен как часть заголовка и вызывать API. Если этого нет, проверьте, разрешают ли они двухсторонние звонки. Однако такие службы обычно не разрешают двухсторонние звонки обычным пользователям.
Для трехстороннего звонка вам может потребоваться браузер для завершения авторизации.
В своем коде вы вызвали маркер запроса и пытаетесь использовать его для получения доступа к сервису. Который не будет работать. Запрос токена - это всего лишь предварительный токен, который необходимо авторизовать. Маркеры запроса не могут использоваться для таких вызовов API. Она не будет работать. После авторизации вам нужно будет вызвать Access Token API, чтобы получить ваш фактический токен, который можно использовать для получения доступа к сервисам, на которые вы авторизованы.
Короче говоря, это процесс
1) Запрос токена >> 2) Авторизация >> 3) Доступ токена
Это поток. Образец в Python
oauth1Session = OAuth1Session(clientKey, clientSecret)
def requestToken(self):
requestTokenResponse = oauth1Session.fetch_request_token(oauth1RequestTokenUrl, realm)
token = requestTokenResponse.get('oauth_token')
secret = requestTokenResponse.get('oauth_token_secret')
return (token, secret)
def authorize(self, token):
authUrl = oauth1Session.authorization_url(oauth1AuthorizeUrl, token)
print (authUrl)
#########
# THIS IS WHERE YOU NEED THE BROWSER.
# You visit authUrl and login with your Username and Password.
# This will complete Authorization
return authUrl
def accessToken(self):
accessTokenResponse = oauth1Session.fetch_access_token(oauth1AccessTokenUrl)
print (accessTokenResponse)
#########
#accessTokenResponse contains your actual token
#
Для части браузера - вы можете попробовать привязки Chromium для Python (мало кто пробовал это раньше - например, этот https://github.com/cztomczak/cefpython). Существуют и другие варианты, такие как использование установленного по умолчанию браузера и другие. Выберите то, что работает для вас.
Как только вы это сделаете - вы можете программно посетить URL (authUrl) и авторизоваться (войти в систему, затем "разрешить") - вы можете быть перенаправлены на обратный вызов (который вы указали в случае OAuth1) с помощью запроса "code" строка. Это код авторизации.
Получив код авторизации, вы можете закрыть окно браузера и вызвать вызов Get Access Token (fetch_access_token).
Надеюсь это поможет!