2017-02-22 19 views
10

OKこれまでの日であり、大きな進歩を遂げましたが、基本については完全に困惑しています。AWS Lambda APIゲートウェイwith Cognito - IdentityIdを使用してUserPool属性にアクセスして更新する方法

私のアプリケーションでは、ユーザーの作成と管理にCognito User Poolsが使用されています。これらは、IdentityIdによってS3で識別されます。私の各ユーザには独自のS3フォルダがあり、AWSは自動的にユーザのIdentityIdと同じフォルダ名を与えます。

私はIdentityIdを他のCognitoユーザー情報に関連付ける必要がありますが、方法を理解することはできません。

私が必要とする重要なことは、特定のIdentityIdのユーザー名と他のCognitoユーザー属性を識別できることです。これは非常に難しいことです。

これで、CognitoユーザーがAWS API Gateway経由でリクエストを行う際にIdentityIdを取得する方法を最初に突き止めました。最後に私はそれを解決しました。そして今、API Gatewayへのリクエストを行うCognitoユーザーがいます.Lambda関数の背後にはIdentityIdがあります。そのビットは動作します。

しかし、私は現在、ユーザープールに格納されているCognitoユーザーの情報にアクセスする方法について完全に困惑しています。私はアイデンティティを使ってCognitoのユーザーの属性、ユーザー名などを取得する方法を示す明確な情報はなく、確かにコードは見つけられません。

「Cognitoユーザープール」を使用してmyメソッドを使用すると、ボディマッピングテンプレートを使用して、サブID、ユーザー名、電子メールアドレスなどのCognitoユーザー情報をコンテキストに入れることができますが、IdentityIdは取得できません。

しかし、APIゲートウェイで自分のメソッドを認証するためにAWS_IAMを使用すると、ボディマッピングテンプレートが逆を行います。サブID、ユーザー名、電子メールなどのCognitoユーザーフィールドは表示されません。

私は夢中になっています.IDIdとすべてのCognitoユーザーのフィールドと属性をどのようにして1つのデータ構造にまとめることができますか?私が1つだけでも他のものを手に入れることができるように思われるという事実は意味をなさない。

答えて

11

AWS Lambda/Cognito/API Gatewayを使用してIdentityIdとユーザーの詳細を同時に取得するには、AWS_IAM(NOT COGNITO_USER_POOLS)を使用して認証されたLambda関数が必要です。リクエストを送信する必要がありますAWS APIゲートウェイは、署名されたリクエストでなければならないため、イベントでIdentityIdを指定できるように(インテリジェントなコンテキストは覚えていないかもしれません)、インテグレーションリクエストボディマッピングテンプレートを変更する必要があります。今、あなたはIdentityIdを持っています。 Phew。これで、フロントエンドからバックエンドにクライアントのCognito IDトークンを送信する必要があります。トークンを検証することが重要です。トークンを検証しないと、それが改ざんされていないとは信じられません。トークンをデコードして検証するには、ユーザープールからキーを取得してスクリプトに入れ、AWSラムダzipfileに含まれるjwtデコードライブラリと署名検証ライブラリがあることを確認してください。これで、スクリプトはフロントエンドから送信されたトークンを検証し、トークンからユーザーの詳細を取得できます。 Voila!これで、IdentityIdに加えて、サブ、ユーザ名、電子メールアドレスなどのユーザ詳細が表示されます。とても簡単。

上記は、AWS Cognito/Lambda/API Gatewayを使用してIdentityIdに関連付けられたユーザー名を取得するために必要なものです。これは働くために数日を要した。

これを見て回っているAmazonの従業員に言ってもいいですか........ IdentityIdに関連付けられたユーザーの詳細を取得するのは難しいです。これを修正する必要があります。それは私が怒って、これはとても難しく、私の時間の多くを燃やしました。

ソリューション: https://s3.amazonaws.com/cup-resources/cup_custom_authorizer_lambda_function_blueprint.zip

を発見し、ここで説明したよう:

私は、Amazonの従業員が独自ここ承認者変更することによって、これをしなかった https://aws.amazon.com/blogs/mobile/integrating-amazon-cognito-user-pools-with-api-gateway/

use strict'; 
let util = require('util'); 

var jwt = require('jsonwebtoken'); 
var jwkToPem = require('jwk-to-pem'); 

var userPoolId = 'YOUR USERPOOL ID'; 
var region = 'YOUR REGION'; //e.g. us-east-1 
var iss = 'https://cognito-idp.' + region + '.amazonaws.com/' + userPoolId; 

//https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html 
// DOWNLOAD FROM https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json 
let userPoolKeys = {PUT YOUR DOWNLOADED USER POOL KEYS JSON HERE}; 
var pems = {}; 

let convertKeysToPems =() => { 
    var keys = userPoolKeys['keys']; 
    for(var i = 0; i < keys.length; i++) { 
     //Convert each key to PEM 
     var key_id = keys[i].kid; 
     var modulus = keys[i].n; 
     var exponent = keys[i].e; 
     var key_type = keys[i].kty; 
     var jwk = { kty: key_type, n: modulus, e: exponent}; 
     var pem = jwkToPem(jwk); 
     pems[key_id] = pem; 
    } 
} 

exports.handler = function(event, context) { 

    convertKeysToPems() 
    console.log(event); 
    let token = event['body-json'].cognitoUserToken; 
    console.log(event['body-json'].cognitoUserToken); 
    ValidateToken(pems, event, context, token); 

}; 


let ValidateToken = (pems, event, context, token) => { 

    //Fail if the token is not jwt 
    var decodedJwt = jwt.decode(token, {complete: true}); 
     console.log(decodedJwt) 
    if (!decodedJwt) { 
     console.log("Not a valid JWT token"); 
     context.fail("Unauthorized"); 
     return; 
    } 

    //Fail if token is not from your UserPool 
    if (decodedJwt.payload.iss != iss) { 
     console.log("invalid issuer"); 
     context.fail("Unauthorized"); 
     return; 
    } 

    //Reject the jwt if it's not an 'Access Token' 
    if (decodedJwt.payload.token_use != 'id') { 
     console.log("Not an id token"); 
     context.fail("Unauthorized"); 
     return; 
    } 

    //Get the kid from the token and retrieve corresponding PEM 
    var kid = decodedJwt.header.kid; 
    var pem = pems[kid]; 
    if (!pem) { 
     console.log(pems, 'pems'); 
     console.log(kid, 'kid'); 
     console.log('Invalid token'); 
     context.fail("Unauthorized"); 
     return; 
    } 

    //Verify the signature of the JWT token to ensure it's really coming from your User Pool 

    jwt.verify(token, pem, { issuer: iss }, function(err, payload) { 
     if(err) { 
     context.fail("Unauthorized"); 
     } else { 
     let x = decodedJwt.payload 
     x.identityId = context.identity.cognitoIdentityId 
     //let x = {'identityId': context['cognito-identity-id'], 'decodedJwt': decodedJwt} 
     console.log(x); 
     context.succeed(x); 
     } 
    }); 
} 
+0

私は難易度にあなたに同意あなたは、提供されたサブと一致するIAM S3ポリシーを作成しようと試みましたか? – Aaron

関連する問題