Виконайте Потік надання коду авторизації
Припускаючи, що ви:
- правильно налаштували пул користувачів в AWS Cognito та
можете зареєструватися / увійти та отримати код доступу за допомогою:
https://<your-domain>.auth.us-west-2.amazoncognito.com/login?response_type=code&client_id=<your-client-id>&redirect_uri=<your-redirect-uri>
Ваш браузер повинен перенаправити на <your-redirect-uri>?code=4dd94e4f-3323-471e-af0f-dc52a8fe98a0
Тепер вам потрібно передати цей код у ваш сервер і попросити його запросити токен для вас.
POST https://<your-domain>.auth.us-west-2.amazoncognito.com/oauth2/token
- встановити
Authorization
заголовок Basic
і використовувати username=<app client id>
і password=<app client secret>
в ваш додаток клієнта , сконфигурированной в AWS Cognito
- встановіть у своєму запиті наступне:
grant_type=authorization_code
code=<your-code>
client_id=<your-client-id>
redirect_uri=<your-redirect-uri>
У разі успіху ваш сервер повинен отримати набір кодованих маркерів base64.
{
id_token: '...',
access_token: '...',
refresh_token: '...',
expires_in: 3600,
token_type: 'Bearer'
}
Тепер, згідно з документацією , ваш сервер повинен перевірити підпис JWT шляхом:
- Розшифровка маркера ідентифікатора
- Порівняння локального ідентифікатора ключа (kid) із загальнодоступним kid
- Використання відкритого ключа для перевірки підпису за допомогою вашої бібліотеки JWT.
Оскільки AWS Cognito генерує дві пари криптографічних ключів RSA для кожного пулу користувачів, вам потрібно з’ясувати, який ключ був використаний для шифрування маркера.
Ось фрагмент NodeJS, який демонструє перевірку JWT.
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')