Skip to content

API Gateway hozzáférés vezérlése Cognito-val

Az API Gateway sorozat során már létrehoztunk egy API Gateway-t és hozzá egy új Lambda függvényt. Ezt a függvényt okkal neveztük el simple-api-auth-nak. Kitalálod, hogy miért? 🤔

Cognito User Pools (felhasználói csoportok)

Az Amazon Cognito egy egyszerű és biztonságos felhasználói regisztrációs, bejelentkezési és hozzáférés-szabályozási eszköz. Képes a felhasználói és az azonossági poolok kezelésére. A felhasználói poolok olyan felhasználói könyvtárak, amelyek regisztrálási és bejelentkezési lehetőségeket biztosítanak az alkalmazás felhasználói számára. Az Identity poolok AWS hitelesítő adatokat biztosítanak, amelyekkel a felhasználók hozzáférhetnek más AWS-szolgáltatásokhoz.

Az API-átjárónkhoz létrehozunk egy Cognito felhasználói csoportot, amely az összes engedélyezési feladatot, beleértve a felhasználónevek, jelszavak és hozzáférési tokenek kezelését is, kezeli.

Kezdjük a Cognitóval és válasszuk a Manage User Pools (felhasználói csoportok kezelése) lehetőséget. Itt válasszuk a Create a user pool-t (felhasználói csoport létrehozása). Nevezzük el a poolunkat simple-api-AUTH-nak, és tekintsük át a Step through settings-et (lépésről lépésre beállításokat), ahogy testre szabjuk a poolunkat. ❗Ne feledjük, hogy ezeket az attribútumokat nem tudjuk megváltoztatni, miután létrehoztuk a pool-t. A házirendek és egyéb pool-beállítások később is módosíthatók, de az attribútumok nem. Amikor az „Alkalmazás-ügyfél” beállításoknál vagyunk, létrehozunk egy új alkalmazás-ügyfelet az API-átjárónkhoz.

Itt állítjuk be az App kliensünket. Az egyszerűség kedvéért kikapcsoljuk a Generate client secret opciót, és engedélyezzük az ALLOW_ADMIN_USER_USER_PASSWORD_AUTH opciót, amelyre szükségünk lesz a Lambda függvényünk eléréséhez.

A felhasználói csoportunk most már készen áll. Ilyen egyszerű 😀.

Felhasználó hozzáadása Cognito felhasználói csoporthoz

Több lehetőségünk is van arra, hogy felhasználókat hozzunk létre a felhasználói készletünkben. Az alapértelmezett beállítások lehetővé teszik a felhasználók számára, hogy saját magukat regisztrálják. Létrehozhatunk egy egyszerű felhasználói felületet, vagy engedélyezhetünk más személyazonosság-szolgáltatókat, mint például a Facebook vagy a „Sign in with Apple”. Az egyszerűség kedvéért a felhasználót manuálisan hozzuk létre a Users and groups (felhasználók és csoportok) alatt.

Miután létrehoztuk a felhasználót, a felhasználó kap egy e-mailt a következő információkkal:

Your username is misi and temporary password is 00eEhtI;.

Úgy tűnik, hogy minden készen áll a Cognito-ban, de ha jobban megnézzük, akkor láthatjuk, hogy a felhasználó még nincs aktiválva. A fiók státusza a következő: FORCE_CHANGE_PASSWORD 😡.

Ezt nem tudjuk megváltoztatni a Cognito felhasználói felületen, ezért ezt inkább a Lambda-ban fogjuk megtenni.

API átjáró csatlakoztatása Cognito-hoz

Most visszamegyünk az API-átjárónkhoz, és kiválasztjuk az Authorizers lehetőséget. Itt válasszuk a Create new authorizer -t (új engedélyező létrehozása).

Kiválasztjuk, hogy a típus Cognito legyen, és kiválasztjuk a korábban létrehozott Cognito felhasználói csoportunkat. A token forrását elnevezheted, ahogyan csak akarod, de a következő szabványok miatt Authorization-nek nevezzük el.

API-metódus biztosítása Cognitóval

Kezdjük el a metódusaink biztosítását a Cognito engedélyezésével. A korábban létrehozott hello erőforráson belül a GET metódust fogom kiválasztani. Ehhez a metódushoz már korábban beállítottuk az API kulcsokat, ezért eltávolítom a szükséges API kulcs opciót, és a Cognito-t választom az engedélyezésünkhöz.

Ha megnézzük a módszerünket, akkor láthatjuk, hogy a Cognito az Authorizer.

Auth függvény előkészítése hitelesítéshez

Amikor egy új Lambda függvényt adtunk hozzá az API átjárónkhoz, létrehoztunk egy auth módszert az átjárónkhoz. Ezt fogjuk használni a hitelesítéshez. Érdemes az Amazon API Gateway már meglévő funkcióira támaszkodni, beleértve a kérések érvényesítését is. Az API Gateway képes validálni a lekérdezési karakterláncot, a fejléceket és a testet. Ez utóbbit egy későbbi bejegyzésben tárgyaljuk, mert ehhez egy modell létrehozása szükséges. A lekérdezési karakterlánc paramétereinek beállítása sokkal egyszerűbb.

Adjuk meg a felhasználónevet és a jelszót URL-lekérdezési karakterlánc paraméterként, és jelöljük meg őket Kötelezőnek. A Request Validator alatt válasszuk a Validate query string parameters and headers lehetőséget.

Az AWS API Gateway mostantól ellenőrzi ezeket a paramétereket, és ha nem léteznek, az átjáró hibát jelez a felhasználónak.

Ne felejtsük el Deploy-olni (közzétenni) az API-t.

Szükséges engedélyek beállítása a Lambda számára

A Lambda függvényünknek hozzá kell férnie a Cognito felhasználói készletünkhöz. Igen, jól sejted, hogy az IAM-et fogjuk használni. ✨

Nincs alapértelmezett házirend a kiadni kívánt engedélyekhez, ezért létrehozunk egy új házirendet. Szükségünk van az AdminInitiateAuth és az AdminSetUserPassword engedélyekre a Lambda függvényünkhöz, hogy kezelni tudjuk a Cognito felhasználói állományunkat.

A Házirendek alatt a „Házirend létrehozása”, a szolgáltatásoknál pedig a Cognito User Pools lehetőséget választjuk. A Művelet alatt kiválasztjuk a két engedélyt, az Erőforrások alatt pedig hozzáadjuk a Cognito User Pool ARN-jét.

Ezután létrehozzuk ezt a házirendet, és csatoljuk a simple-api-Role-hoz, ahogy azt az előző bejegyzésben megtanultuk.

Felhasználó megerősítése

Menjünk vissza a Lambdához, és szabaduljunk meg a bosszantó „FORCE_CHANGE_PASSWORD” állapottól. Ehhez írjunk egy egyszerű Lambda függvényt, amely megváltoztatja a felhasználó jelszavát.

Ezt a kódot használtam a felhasználó megerősítésére:

const params = {
    Password: 'password',
    UserPoolId: 'Pool Id',
    Username: 'username',
    Permanent: true
};
    
await cognito.adminSetUserPassword(params).promise();

Futtassa a kódot, és ha mindent helyesen állítottunk be, a Cognito azt fogja mutatni, hogy a számla státusza mostantól CONFIRMED (megerősített).

Utolsó simítások

Már majdnem kész vagyunk! Már csak egy kis kódot kell írnunk, amely a Cognitót hívja az engedélyezéshez. Szerencsére már van egy minta Lambda függvényünk, amit módosíthatunk: simple-api-auth

Cseréljük ki a korábbi kódot erre a minta kódra:

const aws = require('aws-sdk');
const cognito = new aws.CognitoIdentityServiceProvider();

exports.handler = async (event) => {
    const params = {
        AuthFlow: 'ADMIN_NO_SRP_AUTH',
        ClientId: 'App client id',
        UserPoolId: 'Pool Id',
        AuthParameters: {
            USERNAME: event.queryStringParameters.username,
            PASSWORD: event.queryStringParameters.password
        }
    };
    
    var authResponse = await cognito.adminInitiateAuth(params).promise();
    
    const response = {
        statusCode: 200,
        body: JSON.stringify(authResponse),
    };
    return response;
};

Deploy-ojuk (tegyük közzé) és kész is vagyunk!

API Gateway hitelesítés tesztelése

Menjünk a Postman-be, és nézzük meg, hogy minden az elvárásoknak megfelelően működik-e.

Ha meghívjuk a /hello metódusunkat, a következő hibát kapjuk:

„message”: „Unauthorized”

Nagyszerű! Szükségünk van egy IdTokenre a módszer eléréséhez. Hívjuk meg az auth metódusunkat, hogy megkapjuk a tokent. Az API Gateway ellenőrizni fogja, hogy megvan-e a felhasználónév és a jelszó paraméter. Ha nem, akkor hibát fogunk kapni.

Megkaptuk a token-ünket. 🥳 Ha most visszamegyünk a /hello metódushoz és beállítjuk az Authorization fejlécet, akkor hozzáférünk a függvényhez. Ügyeljünk arra, hogy az IdToken-t használjuk az Authorization-hez.

És voilá! Az API átjárónk mostantól a Cognito-t használja hitelesítésre.

Published inOktatóanyag
0 0 votes
Article Rating
Subscribe
Visszajelzés
guest

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .

0 Comments
Inline Feedbacks
View all comments