Как извлечь id_token из AWS Cognito redirect_url

Я пытаюсь использовать размещенный в AWS Cognito пользовательский интерфейс с WordPress. я успешно загружаю страницу входа и после входа она перенаправляет на данный redirect_url вместе с id_token как

http://example.com/#id_token=eyJraWQiOiJvYzVvK3pwRTFrRHJFYmE0

я не могу получить #id_token в моем php-коде, где мне нужно подтвердить & загрузить моего локального пользователя для сайта WordPress-PHP.

Любая помощь высоко ценится

ниже мой код плагина

<?php

global $login_page;
$login_page = 'https://example.auth.eu-central-1.amazoncognito.com/login?response_type=token&client_id=xxxxxxxx';
$login_page .= '&redirect_uri=http://localhost/example.com';

add_action('init','goto_login_page');
add_filter( 'auth_cookie_malformed', 'check_authentication_token' );

function goto_login_page() {

global $login_page;
$page = basename($_SERVER['REQUEST_URI']);
if (isset($_GET['#id_token'])) {
$jwt = $_GET['#id_token'];
$publicKey = '';
$decoded = JWT::decode($jwt, $publicKey, array('RS256'));
}
else if( $page == "wp-login.php" && $_SERVER['REQUEST_METHOD'] == 'GET') {
wp_redirect($login_page);
exit;
}
}

function check_authentication_token() {

global $login_page;
if (isset($_GET['#id_token'])) {
$jwt = $_GET['#id_token'];
$publicKey = '';
$decoded = JWT::decode($jwt, $publicKey, array('RS256'));
die;
}
else {
var_dump("");
}
}

я пытаюсь использовать некоторые фильтры для переопределения входа в WordPress с помощью пользовательского интерфейса AWS Cognito

0

Решение

после нескольких экспериментов оказалось, что я должен использовать другой подход для входа в систему через вызовы API. Ниже приведены шаги, которым нужно следовать

  1. пользователь response_type=code это ответит кодом авторизации и кодом использования для получения токена [id_token, access_token, refresh_token], т.е.


function get_token() {

if(isset($_GET['code'])) {
$data = array(
'code' => $_GET['code'],
'client_id' => $client_id,
'grant_type' => 'authorization_code',
'scope' => 'email profile openid',
'redirect_uri' => $redirect_uri,
'client_secret' => $client_secret
);

$jwt = httpPost($base_url . '/oauth2/token', $data);
return $jwt;
}
}

  1. декодировать ответ в JSON json_decode($jwt)

  2. получить открытый ключ как ниже метод



function get_public_key() {
global $region, $pool_id;

return json_decode(file_get_contents('https://cognito-idp.' . $region . '.amazonaws.com/' . $pool_id . '/.well-known/jwks.json'));
}

  1. утверждать & извлечь полезную нагрузку с помощью кода, как


foreach ($publicKey->keys as $key) {
try {

$pk = JWK::parseKey($key);

$pay_load = JWT::decode($jwt_json->id_token, $pk, array('RS256'));

if($pay_load !== '') {
return  get_object_vars($pay_load);
}
}
catch (Exception $e) {
error_log($e->getMessage());
}
}

обратите внимание, что класс JWK может быть взят из https://github.com/fproject/php-jwt
так как не является частью firebase \ php-jwt

0

Другие решения

Других решений пока нет …