2017-02-22 13 views
10

ठीक है अब मैं इसमें दिन हूं और महत्वपूर्ण प्रगति की है लेकिन अभी भी मूलभूत सिद्धांतों के बारे में पूरी तरह से फंस गया हूं।कॉग्निटो के साथ एडब्ल्यूएस लैम्ब्डा एपीआई गेटवे - UserPool विशेषताओं को एक्सेस करने और अपडेट करने के लिए पहचान आईडी का उपयोग कैसे करें?

मेरा एप्लिकेशन उपयोगकर्ताओं को बनाने और प्रबंधित करने के लिए कॉग्निटो उपयोगकर्ता पूल का उपयोग करता है - इन्हें एस 3 पर पहचाना जाता है, यह उनकी पहचान आईडी द्वारा लगता है। मेरे प्रत्येक उपयोगकर्ता का अपना स्वयं का S3 फ़ोल्डर होता है, और एडब्लूएस स्वचालित रूप से उन्हें एक फ़ोल्डर नाम देता है जो उपयोगकर्ता की पहचान आईडी के बराबर होता है।

मुझे पहचान को अन्य कॉग्निटो उपयोगकर्ता जानकारी से संबंधित करने की आवश्यकता है लेकिन यह कैसे काम नहीं कर सकता है।

मुझे जो मुख्य चीज चाहिए वह किसी दिए गए पहचान आईडी के लिए उपयोगकर्ता नाम और अन्य कॉग्निटो उपयोगकर्ता विशेषताओं की पहचान करने में सक्षम होना है - और यह बेहद मुश्किल है।

तो पहली लड़ाई पहचानने के लिए थी जब एक कॉग्निटो उपयोगकर्ता एडब्ल्यूएस एपीआई गेटवे के माध्यम से अनुरोध करता है। आखिर में मुझे यह पता चला कि, और अब मेरे पास एक कॉग्निटो उपयोगकर्ता है, जो एपीआई गेटवे के लिए अनुरोध करता है, और मेरे लैम्ब्डा फ़ंक्शन के पीछे अब पहचान आईडी है। वह काम करता है।

लेकिन मैं पूरी तरह से स्टंप हूं कि उपयोगकर्ता पूल में संग्रहीत कॉग्निटो उपयोगकर्ता की जानकारी को कैसे पहुंचाया जाए। मुझे कोई स्पष्ट जानकारी नहीं मिल रही है, और निश्चित रूप से कोई कोड नहीं है, जो दिखाता है कि कॉग्निटो उपयोगकर्ता के गुण, उपयोगकर्ता नाम इत्यादि प्राप्त करने के लिए पहचान आईडी का उपयोग कैसे करें

ऐसा प्रतीत होता है कि अगर मैं "कोग्निटो उपयोगकर्ता पूल" का उपयोग प्राधिकृत करने के लिए करता हूं एपीआई गेटवे में विधि, फिर बॉडी मैपिंग टेम्पलेट का उपयोग संदर्भ में उप और उपयोगकर्ता नाम और ईमेल पते जैसे कॉग्निटो उपयोगकर्ता जानकारी को रखने के लिए किया जा सकता है, लेकिन मुझे पहचान आईडी नहीं मिलती है।

लेकिन अगर मैं एपीआई गेटवे में अपनी विधि को अधिकृत करने के लिए AWS_IAM का उपयोग करता हूं तो शरीर मैपिंग टेम्पलेट उलटा करता है - यह मुझे पहचान आईडी देता है लेकिन कॉग्निटो उपयोगकर्ता फ़ील्ड जैसे उप और उपयोगकर्ता नाम और ईमेल नहीं देता है।

यह मुझे पागल कर रहा है - मैं पहचान आईडी कैसे प्राप्त कर सकता हूं और सभी कॉग्निटो उपयोगकर्ता फ़ील्ड और एक डेटा संरचना में एक साथ विशेषताएँ कैसे प्राप्त कर सकता हूं? तथ्य यह है कि मुझे लगता है कि मैं केवल एक या दूसरे को प्राप्त करने में सक्षम हूं, इसका कोई मतलब नहीं है।

उत्तर

11

यह पता चला है कि एडब्ल्यूएस लैम्ब्डा/कॉग्निटो/एपीआई गेटवे का उपयोग करते हुए पहचान आईडी और उपयोगकर्ता विवरण प्राप्त करने के लिए, आपको एक लैम्ब्डा फ़ंक्शन होना चाहिए जो AWS_IAM (NOT COGNITO_USER_POOLS) का उपयोग करके प्रमाणीकृत नहीं है, आपको अपना अनुरोध भेजना होगा एडब्ल्यूएस एपीआई गेटवे, लेकिन यह एक हस्ताक्षरित अनुरोध होना चाहिए, फिर आपको एकीकरण अनुरोध बॉडी मैपिंग टेम्पलेट्स को संशोधित करना होगा ताकि आपको ईवेंट में पहचान आईडी दी जा सके (शायद संदर्भ? याद नहीं है)। अब आपके पास पहचान आईडी है। ओह। अब आपको फ्रंट एंड से बैक एंड तक क्लाइंट का कॉग्निटो आईडी टोकन सबमिट करना होगा। टोकन को सत्यापित करना महत्वपूर्ण है - आप भरोसा नहीं कर सकते कि अगर आप इसे मान्य नहीं करते हैं तो इससे छेड़छाड़ नहीं हुई है। टोकन को डीकोड और सत्यापित करने के लिए आपको अपने उपयोगकर्तापूल से चाबियाँ प्राप्त करनी होंगी, उन्हें अपनी स्क्रिप्ट में रखें, सुनिश्चित करें कि आपके पास आपके एडब्ल्यूएस लैम्ब्डा ज़िपफाइल में जेडटी डीकोडिंग लाइब्रेरीज़ और हस्ताक्षर सत्यापन पुस्तकालय शामिल हैं। अब आपकी स्क्रिप्ट को फ्रंट एंड से सबमिट किए गए टोकन को सत्यापित करना होगा और फिर आप टोकन से उपयोगकर्ता विवरण प्राप्त कर सकते हैं। देखा! अब आपके पास पहचान सब आईडी और उपयोगकर्ता के विवरण जैसे उनके उप, उपयोगकर्ता नाम और ईमेल पते दोनों हैं। इतना आसान।

एडब्ल्यूएस कॉग्निटो/लैम्ब्डा/एपीआई गेटवे का उपयोग कर पहचानकर्ता आईडी से उपयोगकर्ता नाम प्राप्त करने के लिए ऊपर क्या होता है। मुझे काम करने के लिए दिन लग गए।

क्या मैं किसी भी अमेज़ॅन कर्मचारियों से कह सकता हूं जो इस पर घूमते हैं ........ अच्छी तरह से पहचान आईडी के साथ उपयोगकर्ता विवरण प्राप्त करना बहुत मुश्किल है। आपको इसे ठीक करने की ज़रूरत है। यह मुझे गुस्से में डाल दिया कि यह इतना कठिन था और मेरा इतना समय जला दिया।

समाधान:

मैं संशोधित एक अमेज़न कर्मचारियों कस्टम यहाँ authorizer द्वारा ऐसा किया: के रूप में पाया जाता है और यहाँ वर्णित https://s3.amazonaws.com/cup-resources/cup_custom_authorizer_lambda_function_blueprint.zip

: 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

मैं कठिनाई पर आपसे सहमत , क्या आपको आईएएम एस 3 नीतियों को बनाने का प्रयास करने का मौका मिला है जो आपूर्ति किए गए उप से मेल खाते हैं? – Aaron

संबंधित मुद्दे