Я новичок в 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
. Я не совсем уверен, какие адреса использовать или как определить подходящие.
Если бы кто-нибудь мог помочь предоставить некоторую помощь или предложения о том, как правильно реализовать это, мы будем очень признательны.