Получение токена Oauth2 в swagger и взаимодействие с API с использованием Python - PullRequest
0 голосов
/ 06 августа 2020

Я новичок в python, и я пытаюсь написать простую программу, которая отправляет последовательность ДНК в API и возвращает некоторые простые параметры обратно. Насколько я понимаю, здесь используется аутентификация Oauth2.0, поэтому мне нужно запросить токен, используя мой идентификатор клиента и секрет клиента, а затем передать этот токен через почтовый запрос вместе с данными для получения желаемого результата. API - это чванство, и с помощью их интерфейса я могу отправлять и получать данные, но я понятия не имею, как на самом деле реализовать это в коде. Ниже приведен вывод, сгенерированный API с помощью swagger:

Curl

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Authorization: Bearer <XXXXXXXXXXXXX>' -d '{ \ 
   "Sequence": "TGACCCCATATTGGGAGG", \ 
   "NaConc": 50, \ 
   "FoldingTemp": 25, \ 
   "MgConc": 0, \ 
   "NucleotideType": "DNA" \ 
 }' 'https://www.idtdna.com/Restapi/v1/OligoAnalyzer/Hairpin'

Тело ответа

[
  {
    "id": "521e5459-236b-4443-9236-f6ade040ac3d",
    "sequence": "CAGCAGTCATGCAATCG",
    "thermo": 49.3,
    "deltaS": -94.91,
    "deltaG": -2.3,
    "deltaH": -30.6,
    "success": true,
    "RNA": false,
    "errorMessages": []
  }
]

URL-адрес запроса

https://www.idtdna.com/Restapi/v1/OligoAnalyzer/Hairpin

интерфейс swagger авторизация swagger

Я попытался реализовать это в python, отправив почтовый запрос и передав идентификатор клиента и секрет клиента в качестве аутентификации вместе со словарем ввода данных.

import requests
import json
from requests_oauthlib import OAuth2Session

username = 'MyUsername'
password = 'MyPassword'

client_id = 'MyClientID'
client_secret = 'MySecret'

authorize_url = 'https://www.idtdna.com/IdentityServer/connect/authorize'
token_url = 'https://www.idtdna.com/IdentityServer/connect/token'

redirect_uri = 'https://www.idtdna.com/Restapi/swagger/docs/v1'

application_url = 'https://www.idtdna.com/Restapi/v1/OligoAnalyzer/Hairpin'

HairPinRequest = {
    'Sequence': 'CGATCGATCGAT',
    'NaConc': 50,
    'FoldingTemp': 25,
    'MgConc': 0,
    'NucleotideType': 'DNA'
}

oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=application_url)

token = oauth.fetch_token(
    token_url, 
    authorize_url,
    username=username,
    password=password,
    client_id=client_id, 
    client_secret=client_secret 
    )

response = oauth.post(application_url, data=HairPinRequest)

print(response.url)
print(response)

Запуск этого кода приводит к неавторизованной клиентской ошибке:

\DNAsequencer.py", line 38, in <module> 
    client_secret=client_secret
\Anaconda3\lib\site-packages\requests_oauthlib\oauth2_session.py", line 360, in fetch_token    
    self._client.parse_request_body_response(r.text, scope=self.scope)
\Anaconda3\lib\site-packages\oauthlib\oauth2\rfc6749\clients\base.py", line 421, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
\Anaconda3\lib\site-packages\oauthlib\oauth2\rfc6749\parameters.py", line 431, in parse_token_response
    validate_token_parameters(params)
\Anaconda3\lib\site-packages\oauthlib\oauth2\rfc6749\parameters.py", line 438, in validate_token_parameters
    raise_from_error(params.get('error'), params)
\Anaconda3\lib\site-packages\oauthlib\oauth2\rfc6749\errors.py", line 405, in raise_from_error 
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.UnauthorizedClientError: (unauthorized_client)

Итак, я знаю, что он достигает API, но не аутентифицируется должным образом. Я все еще не уверен, что верны две вещи: scope и redirect_uri. Я не совсем уверен, какие адреса использовать или как определить подходящие.

Если бы кто-нибудь мог помочь предоставить некоторую помощь или предложения о том, как правильно реализовать это, мы будем очень признательны.

...