Führen Sie einen Berechtigungscode-Grant-Flow aus
Angenommen, Sie:
- einen Benutzerpool in AWS Cognito korrekt konfiguriert haben und
können sich anmelden / anmelden und erhalten einen Zugangscode über:
https://<your-domain>.auth.us-west-2.amazoncognito.com/login?response_type=code&client_id=<your-client-id>&redirect_uri=<your-redirect-uri>
Ihr Browser sollte zu umleiten <your-redirect-uri>?code=4dd94e4f-3323-471e-af0f-dc52a8fe98a0
Jetzt müssen Sie diesen Code an Ihr Back-End übergeben und ein Token für Sie anfordern lassen.
POST https://<your-domain>.auth.us-west-2.amazoncognito.com/oauth2/token
- stellen Sie Ihren
Authorization
Kopf Basic
und Verwendung username=<app client id>
und password=<app client secret>
pro App - Client konfiguriert in AWS Cognito
- Stellen Sie in Ihrem Anfragetext Folgendes ein:
grant_type=authorization_code
code=<your-code>
client_id=<your-client-id>
redirect_uri=<your-redirect-uri>
Bei Erfolg sollte Ihr Back-End einen Satz von Base64-codierten Token erhalten.
{
id_token: '...',
access_token: '...',
refresh_token: '...',
expires_in: 3600,
token_type: 'Bearer'
}
Gemäß der Dokumentation sollte Ihr Back-End nun die JWT-Signatur überprüfen durch:
- ID-Token dekodieren
- Vergleich der lokalen Schlüssel-ID (Kind) mit dem öffentlichen Kind
- Verwenden des öffentlichen Schlüssels zum Überprüfen der Signatur mithilfe Ihrer JWT-Bibliothek.
Da AWS Cognito für jeden Benutzerpool zwei Paare von RSA-Kryptografieschlüsseln generiert, müssen Sie herausfinden, welcher Schlüssel zum Verschlüsseln des Tokens verwendet wurde.
Hier ist ein NodeJS- Snippet, das die Überprüfung eines JWT demonstriert.
import jsonwebtoken from 'jsonwebtoken'
import jwkToPem from 'jwk-to-pem'
const jsonWebKeys = [
{
"alg": "RS256",
"e": "AQAB",
"kid": "ABCDEFGHIJKLMNOPabc/1A2B3CZ5x6y7MA56Cy+6ubf=",
"kty": "RSA",
"n": "...",
"use": "sig"
},
{
"alg": "RS256",
"e": "AQAB",
"kid": "XYZAAAAAAAAAAAAAAA/1A2B3CZ5x6y7MA56Cy+6abc=",
"kty": "RSA",
"n": "...",
"use": "sig"
}
]
function validateToken(token) {
const header = decodeTokenHeader(token);
const jsonWebKey = getJsonWebKeyWithKID(header.kid);
verifyJsonWebTokenSignature(token, jsonWebKey, (err, decodedToken) => {
if (err) {
console.error(err);
} else {
console.log(decodedToken);
}
})
}
function decodeTokenHeader(token) {
const [headerEncoded] = token.split('.');
const buff = new Buffer(headerEncoded, 'base64');
const text = buff.toString('ascii');
return JSON.parse(text);
}
function getJsonWebKeyWithKID(kid) {
for (let jwk of jsonWebKeys) {
if (jwk.kid === kid) {
return jwk;
}
}
return null
}
function verifyJsonWebTokenSignature(token, jsonWebKey, clbk) {
const pem = jwkToPem(jsonWebKey);
jsonwebtoken.verify(token, pem, {algorithms: ['RS256']}, (err, decodedToken) => clbk(err, decodedToken))
}
validateToken('xxxxxxxxx.XXXXXXXX.xxxxxxxx')