8
votes

AWS API Gateway + Cognito Pool Pool Authorizer + Lambda - Les en-têtes HTTP et les autorisations Dois-je régler?

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.

ma configuration:

sur AWS:

  • API de repos implémenté sur AWS Lambda (déployé via Cadre sans serveur),
  • exposé via une passerelle API à l'aide de type lambda_Proxy (pas de cartographie manuelle)
  • Autorisation sur la passerelle API via la "Authoriseur de pool d'utilisateurs de Cognito" (non "AWS_IAM", Aucun autorisant codé personnalisé)
  • Test de l'API via Postman

    sur le client iOS

    • Enregistrement / Connexion via AWS Cognito (SDK et UI copiés à partir du projet Demo Xcode généré par AWS Mobile Hub)
    • Accédant à l'API de repos via Restkit , pas à l'aide du SDK AWSAPIGHTWAY < / li>

      Qu'est-ce qui fonctionne:

      Les méthodes API sont correctement déployées via Server Server.

      Je peux appeler le public (non configuré pour utiliser le pool d'utilisateurs) via Postman.

      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 méthode.Request.header.authorisation (le Par défaut) Comme décrit ici

      sur iOS, je peux vous enregistrer et connecter correctement en tant qu'utilisateur. Je peux jeter les informations d'identification AWS à la console, affichant Accesskey , Secretkey et sessionkey . .

      sur iOS, je peux interroger l'API publique via Restkit.

      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 {"Message": "non autorisé"} . (Qui est attendu, sans définir aucune autorisation.)

      Qu'est-ce qui échoue:

      Pour tester l'autorisation, dans Postman, j'ai essayé

      • Copier / coller le SessionKey J'ai reçu du client iOS comme http autorisation en-tête - tel que défini ICI (dernier paragraphe -" API Gateway's Authorizer pour Cognito User Pools ")
      • et comme x-amz-sécurité-jeton en-tête

        Le résultat a toujours été la même erreur 401.

        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?

        Comment puis-je mieux déboguer le flux d'autorisations / autorisation?


6 commentaires

Vous mentionnez l'utilisation de sessionkey ; Est-ce que cela se référait à l'un des jetons jeton ou Access Jeton ? En d'autres termes, il devrait s'agir d'un jeton de clé Web JSON 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) qui devrait renvoyer une session de type awscognitoIdentitinityUsersersession ; jeton est accessible en tant que session.accessToken? .tokenstring


J'utilise le code du projet de démonstration généré AWS. Il utilise [[[AwssidityManager DefauldentitinityManager] LoginwithsigninProvider: [AwsconfonferpoolssigninProvider SharedInstance] Achèvementhandler: ...] 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]; . Ensuite, je peux utiliser task.result.idtoken.tokenstring en tant que autorisation` http en-tête et fonctionne.


(Si vous voulez écrire cela comme une réponse, je l'accepterai.)


3 Réponses :


2
votes

Voici comment obtenir la session: xxx

puis, tâche.result.idtoken.tokenstring peut être défini comme "Autorisation", et fonctionne .

merci Peter pour la pointe!


0 commentaires

2
votes

pour iOS (à compter du 11 mai 2017) xxx

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?)


1 commentaires

Merci - c'est fondamentalement ce que j'ai décrit ci-dessous. Je n'avais pas besoin de définir le Accesskey , SecretKey et sessionkey en-têtes, juste autorisation était suffisant.



1
votes

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))")


0 commentaires