Ошибка HTTP 401: Несанкционированная проблема при вызове Rest API с библиотекой urllib в Python 3.8

#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"
  ]
}

 

Спасибо!