Nicht autorisierter Amazon SP-API-Fehler: „Das von Ihnen bereitgestellte Zugriffstoken ist widerrufen, fehlerhaft oder uPython

Python-Programme
Anonymous
 Nicht autorisierter Amazon SP-API-Fehler: „Das von Ihnen bereitgestellte Zugriffstoken ist widerrufen, fehlerhaft oder u

Post by Anonymous »

Ich versuche, mit der Amazon Selling Partner API (SP-API) zu interagieren, um Werbeanfragen über die folgende Flask-App zu senden. Das Zugriffstoken wurde erfolgreich abgerufen, aber wenn ich die Anfrage an den Solicitations-Endpunkt stelle, erhalte ich eine nicht autorisierte Fehlermeldung mit der Meldung:

Code: Select all

{
"error": {
"errors": [
{
"code": "Unauthorized",
"details": "The access token you provided is revoked, malformed or invalid.",
"message": "Access to requested resource is denied."
}
]
}
}

Code: Select all

import boto3
import botocore
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
from botocore.credentials import Credentials
from flask import Flask, redirect, request, session, url_for, jsonify
import requests

app = Flask(__name__)
app.secret_key = 'test'

# OAuth credentials
CLIENT_ID = 'amzn1.application-oa2-client.XXXX'
CLIENT_SECRET = 'amzn1.oa2-cs.v1.XXXX'
REDIRECT_URI = 'https://example.com/callback'

AUTHORIZATION_URL = 'https://www.amazon.com/ap/oa'
TOKEN_URL = 'https://api.amazon.com/auth/o2/token'
SOLICITATIONS_URL = 'https://sellingpartnerapi-na.amazon.com/solicitations/v1/orders'

AWS_ACCESS_KEY_ID = "XXXX"
AWS_SECRET_ACCESS_KEY = "XXXX"
AWS_REGION = 'us-east-1'

def get_aws_credentials():
return Credentials(
access_key=AWS_ACCESS_KEY_ID,
secret_key=AWS_SECRET_ACCESS_KEY
)

@app.route('/')
def home():
return '[url=/login]Login with Amazon[/url]'

@app.route('/login')
def login():
scope = 'sellingpartnerapi::notifications'
auth_url = f'{AUTHORIZATION_URL}?client_id={CLIENT_ID}&scope={scope}&response_type=code&redirect_uri={REDIRECT_URI}'
return redirect(auth_url)

@app.route('/callback')
def callback():
code = request.args.get('code')
token_data = {
'grant_type': 'authorization_code',
'code': code,
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
'redirect_uri': REDIRECT_URI,
}
token_response = requests.post(TOKEN_URL, data=token_data)
token_json = token_response.json()
session['access_token'] = token_json['access_token']
session['refresh_token'] = token_json['refresh_token']
return redirect(url_for('solicitations'))

def get_spapi_access_token():
refresh_token = session.get('refresh_token')
token_data = {
'grant_type': 'refresh_token',
'refresh_token': refresh_token,
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
}
token_response = requests.post(TOKEN_URL, data=token_data)
token_json = token_response.json()
return token_json['access_token']

@app.route('/solicitations')
def solicitations():
access_token = get_spapi_access_token()
amazon_order_id = 'ORDER ID' # I put a real one
marketplace_id = 'ATVPDKIKX0DER'
solicitations_url = f'{SOLICITATIONS_URL}/{amazon_order_id}/solicitations/productReviewAndSellerFeedback?marketplaceIds={marketplace_id}'
headers = {'x-amz-access-token': access_token, 'content-type': 'application/json'}
request_obj = AWSRequest(method='POST', url=solicitations_url, headers=headers)
credentials = get_aws_credentials()
SigV4Auth(credentials, 'execute-api', AWS_REGION).add_auth(request_obj)
prepared_request = requests.Request(
method=request_obj.method,
url=request_obj.url,
headers=dict(request_obj.headers),
data=request_obj.body
).prepare()
response = requests.Session().send(prepared_request)
return jsonify(response.json()), response.status_code
Warum erhalte ich die Fehlermeldung „Nicht autorisiert“, obwohl das Zugriffstoken erfolgreich abgerufen wurde?
Könnte dies ein Problem damit sein, wie das Token für die Werbeanfrage verwendet oder signiert wird?
Ich habe überprüft, dass mein Entwicklerprofil in Seller Central für den Werbebereich zugelassen ist. Für jede Hilfe bei der Fehlerbehebung wäre ich sehr dankbar!
Was ich versucht habe:
  • Ich bin dem OAuth-Ablauf gefolgt, um ein Zugriffstoken abzurufen, und habe sowohl das Zugriffstoken als auch das Aktualisierungstoken erfolgreich gespeichert.
  • Ich habe dann das Zugriffstoken verwendet, um eine POST-Anfrage an den Solicitations-API-Endpunkt zu senden (/solicitations/productReviewAndSellerFeedback).
  • Ich habe die Anfrage mit AWS Signature Version 4 mit meinen IAM-Benutzeranmeldeinformationen signiert und die Anfrage über die Anfragebibliothek gesendet.
    Was ich erwartet habe:
  • Ich habe erwartet, dass die API die Anfrageanfrage verarbeitet und eine Erfolgsantwort (HTTP 200) zurückgibt, die angibt, dass die Anfrage angenommen wurde.
Stattdessen erhielt ich einen nicht autorisierten Fehler (403) mit der Meldung, dass das Zugriffstoken „widerrufen, fehlerhaft oder ungültig“ sei.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post