#lambda #python-3.8
Вопрос:
Я вызываю общедоступный API с поддержкой OAuth 2.0 в Python 3.8, чтобы сохранить ответ json в AWS-S3 с помощью функции AWS Lambda. Я сталкиваюсь с ошибкой HTTP Ошибка 401: Несанкционированный.
Функция(fnGetToken), которая получает токен, работает, и я могу успешно использовать токен в Postman и получить ответ. Код прерывается в функции fnGetFeed с сообщением об ошибке, показанным ниже. Я думаю, что urllib.request.urlopen(req) вызывает, но я думаю, что это стандартно. Я не эксперт по python и поэтому прошу экспертов поделиться своими отзывами, чтобы решить эту проблему.
import json
import base64
import urllib.request
import os
import boto3
def fnGetToken():
url = os.environ['authurl']
headers = {}
key = os.environ['okey']
secret = os.environ['osecret']
# auth header will be combination of client id, secret with 'Basic' Auth Header
authHeader = 'Basic ' str(base64.b64encode(bytes((key ':' secret), 'utf-8')), "utf-8")
print(authHeader)
headers['Authorization'] = authHeader
headers['ContentType'] = 'application/x-www-form-urlencoded;charset=UTF-8'
data = "grant_type=client_credentials"
req = urllib.request.Request(url, headers = headers, method = 'POST')
response = urllib.request.urlopen(req, data.encode('utf-8'))
respData = response.read()
data = json.loads(respData)
return data['access_token']
def fnGetFeed(token):
screenname = os.environ['screenname']
url = str(os.environ['apiurl']) screenname
print("url generated {}".format(url))
headers = {}
authHeader = 'bearer ' token
print("token passed: ".format(authHeader))
headers['Authorization'] = authHeader
req = urllib.request.Request(url, headers = headers, method = 'GET')
response = urllib.request.urlopen(req)
respData = response.read()
data = json.loads(respData)
return data
def lambda_handler(event, context):
token = fnGetToken()
print ("Token generated successfully {}".format(token))
data = fnGetFeed(token)
print ("response from get feed function {}".format(data))
{
"errorMessage": "HTTP Error 401: Unauthorized",
"errorType": "HTTPError",
"stackTrace": [
" File "/var/task/lambda_function.py", line 58, in lambda_handlern data = fnGetFeed(token)n",
" File "/var/task/lambda_function.py", line 42, in fnGetFeedn response = urllib.request.urlopen(req)n",
" File "/var/lang/lib/python3.8/urllib/request.py", line 222, in urlopenn return opener.open(url, data, timeout)n",
" File "/var/lang/lib/python3.8/urllib/request.py", line 531, in openn response = meth(req, response)n",
" File "/var/lang/lib/python3.8/urllib/request.py", line 640, in http_responsen response = self.parent.error(n",
" File "/var/lang/lib/python3.8/urllib/request.py", line 569, in errorn return self._call_chain(*args)n",
" File "/var/lang/lib/python3.8/urllib/request.py", line 502, in _call_chainn result = func(*args)n",
" File "/var/lang/lib/python3.8/urllib/request.py", line 649, in http_error_defaultn raise HTTPError(req.full_url, code, msg, hdrs, fp)n"
]
}
Спасибо!