J'ai des problèmes pour obtenir l'autorisation de mon API sur AWS pour un pool d'utilisateurs Cognito via des en-têtes HTTP (sans AWS API Gateway SDK) à travailler. P>
sur AWS: P>
sur le client iOS p>
Les méthodes API sont correctement déployées via Server Server. P>
Je peux appeler le public (non configuré pour utiliser le pool d'utilisateurs) via Postman. p>
Pour les méthodes d'API privées, je peux voir l'autoriseur de pool d'utilisateurs Cognito configurée dans la console de gestion de la passerelle API, y compris "Source de jeton d'identité" définie sur sur iOS, je peux vous enregistrer et connecter correctement en tant qu'utilisateur. Je peux jeter les informations d'identification AWS à la console, affichant sur iOS, je peux interroger l'API publique via Restkit. P>
Lorsque j'essaie d'appeler une méthode d'API privée via Postman, je récupère une erreur HTTP 401 avec le corps Pour tester l'autorisation, dans Postman, j'ai essayé p>
Le résultat a toujours été la même erreur 401. P>
Que dois-je définir comme des en-têtes HTTP afin d'autoriser les appels à l'API privé? "autorisation" devrait Travail - Peut-être que des autorisations de rôle? strong> p>
Comment puis-je mieux déboguer le flux d'autorisations / autorisation? strong> p>
méthode.Request.header.authorisation code> (le Par défaut) Comme décrit ici P>
Accesskey code>,
Secretkey code> et
sessionkey code>. P>.
{"Message": "non autorisé"} code>. (Qui est attendu, sans définir aucune autorisation.) P>
SessionKey CODE> J'ai reçu du client iOS comme http
autorisation code> en-tête - tel que défini ICI (dernier paragraphe -" API Gateway's Authorizer pour Cognito User Pools ") li>
x-amz-sécurité-jeton code> en-tête li>
ul>
3 Réponses :
Voici comment obtenir la session: puis, merci Peter pour la pointe! p> p> tâche.result.idtoken.tokenstring code> peut être défini comme "Autorisation", et fonctionne . P>
pour iOS (à compter du 11 mai 2017) où awscredentials, vous pouvez obtenir sur une connexion réussie et le stocker quelque part dans votre propre code (Authorizationervice?). J'ai gardé la valeur "Autorisation" si longtemps afin qu'il soit plus facile pour les développeurs de connaître l'emplacement complet de cet objet caché. Vous devez le garder dans votre propre catégorie AuthorizationVice (ou comme membre de l'extension à Awscredentials?) P> P>
Merci - c'est fondamentalement ce que j'ai décrit ci-dessous. Je n'avais pas besoin de définir le Accesskey code>,
SecretKey code> et
sessionkey code> en-têtes, juste
autorisation code> était suffisant.
Si vous utilisez Swift 3, vous pouvez obtenir un jeton d'identité par le code ci-dessous.
let pool = AWSCognitoUserPoolsSignInProvider.sharedInstance().getUserPool() let currentUser = pool.currentUser() let task = currentUser?.getSession() let identityToken = task?.result?.idToken?.tokenString print("identityToken: \(String(describing: identityToken))")
Vous mentionnez l'utilisation de
sessionkey code>; Est-ce que cela se référait à l'un des jetons code> jeton code> ou
Access Jeton code>? En d'autres termes, il devrait s'agir d'un jeton de clé Web de code> JSON code> aussi loin que je suis conscient. Selon docs.aws.amazon.com/cognito/latest/developerguide/.../a>
Merci Peter - vous semblez avoir raison, il y a deux types de jetons utilisés, et ce n'était pas clair pour moi lequel à utiliser. Si le JWT est attendu, je n'ai trouvé aucune information sur la façon de l'obtenir (il existe une méthode dans l'Android SDK docs.aws.amazon.com/cognito/latest/developerguide/... , mais pas dans le SDK iOS Docs. aws.amazon.com/cognito/latest/developerguide/.../a>)
Je suppose que vous vous connectez à votre utilisateur avec une méthode similaire à
Getession (nom d'utilisateur, mot de passe: mot de passe, validationData: nil, scopes: nil) code> qui devrait renvoyer une session code> de type
awscognitoIdentitinityUsersersession code>; jeton est accessible en tant que
session.accessToken? .tokenstring code>
J'utilise le code du projet de démonstration généré AWS. Il utilise
[[[AwssidityManager DefauldentitinityManager] LoginwithsigninProvider: [AwsconfonferpoolssigninProvider SharedInstance] Achèvementhandler: ...] Code> Je pensais que je sauve un peu de temps en réutilisant le code et l'interface utilisateur de la démo AWS, mais je commence regretter cette décision ...
@Peterpajchl Vous aviez raison et j'ai découvert comment obtenir la session:
AwscognitoIdentityUserPool * Piscine = [AwsconfianceToIdidentityUserPool CognitOidentityUserPoolForkey: AwsconfianceerpoolsSigninProvi Derkey]; AwsconfianceOididentityUser * User = [Pool CourmentUser]; Awstask * Tâche = [GETESTATION DE L'UTILISATEUR]; CODE>. Ensuite, je peux utiliser
task.result.idtoken.tokenstring en tant que code> autorisation` http en-tête et fonctionne.
(Si vous voulez écrire cela comme une réponse, je l'accepterai.)