J'essaie d'utiliser le service AWS cognito pour authentifier et télécharger un fichier. On m'a fourni mon regionType, identitéPool, ID de compte AWS, et UnAuthRole. Je connais également les noms des baies de production et de développement.Amazon AWS Cognito et Python Boto3 pour établir la connexion AWS et télécharger le fichier dans le compartiment
Je pense que je définis la clé d'accès AWS et la clé secrète AWS ... Je veux m'authentifier avec cognito et utiliser les résultats pour me permettre de faire une liste de seau et plus tard un téléchargement de fichier.
Qu'est-ce que je fais mal? Comment puis-je utiliser l'identifiant cognito pour établir une connexion S3?
Voici mon code et l'erreur résultant:
#!/usr/bin/python
import boto3
import boto
#boto.set_stream_logger('foo')
import json
client = boto3.client('cognito-identity','us-east-1')
resp = client.get_id(AccountId='<ACCNTID>',IdentityPoolId='<IDPOOLID>')
print "\nIdentity ID: %s"%(resp['IdentityId'])
print "\nRequest ID: %s"%(resp['ResponseMetadata']['RequestId'])
resp = client.get_open_id_token(IdentityId=resp['IdentityId'])
token = resp['Token']
print "\nToken: %s"%(token)
print "\nIdentity ID: %s"%(resp['IdentityId'])
resp = client.get_credentials_for_identity(IdentityId=resp['IdentityId'])
secretKey = resp['Credentials']['SecretKey']
accessKey = resp['Credentials']['AccessKeyId']
print "\nSecretKey: %s"%(secretKey)
print "\nAccessKey ID: %s"%(accessKey)
print resp
conn = boto.connect_s3(aws_access_key_id=accessKey,aws_secret_access_key=secretKey,debug=0)
print "\nConnection: %s"%(conn)
for bucket in conn.get_all_buckets():
print bucket.name
Erreur:
Traceback (most recent call last):
File "./test.py", line 32, in <module>
for bucket in conn.get_all_buckets():
File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 440, in get_all_buckets
response.status, response.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidAccessKeyId</Code><Message>The AWS Access Key Id you provided does not exist in our records.</Message><AWSAccessKeyId>ASIAILXMPZEMJAVZN7TQ</AWSAccessKeyId><RequestId>10631ACFF95610DD</RequestId><HostId>PGWDRBmhLjjv8Ast8v6kVHOG3xR8erJRV2ob3/2RmqHXwrg8HCZV578YsNLaoL24Hknr+nh033U=</HostId></Error>
Ce code iOS correspondant fonctionne très bien:
AWSCognitoCredentialsProvider *credentialsProvider =
[AWSCognitoCredentialsProvider credentialsWithRegionType:awsCognitoRegionType
accountId:awsAccountId
identityPoolId:awsCognitoIdentityPool
unauthRoleArn:unauthRoleArn
authRoleArn:nil];
AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:awsCognitoRegionType
credentialsProvider:credentialsProvider];
....
AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new];
uploadRequest.bucket = [ELEEnvironment currentEnvironment].userDataS3Bucket;
uploadRequest.key = key;
uploadRequest.body = uploadFileURL;
[[self uploadTask:uploadRequest] continueWithExecutor:[BFExecutor mainThreadExecutor]...
Merci pour toute aide!
Salut lulian, j'ai oublié de le renommer dans mon article. Les noms de compartiment existent et correspondent à mon code mais je pense que le 403 est parce que je fournis des qualifications incorrectement. Voyez-vous quelque chose de mal avec mon flux d'authentification? Où dois-je utiliser le jeton? – PhilBot
J'ai mis à jour mon message - je reçois un 403 en essayant de lister tous les seaux. Donc, connect_s3 ne fonctionne pas bien que tous les appels aboutissent. – PhilBot