如何从 AWS Cognito redirect_url 中提取 id_token
How to extract id_token from AWS Cognito redirect_url
我正在尝试将 AWS Cognito 托管 UI 与 WordPress 一起使用。我成功加载了登录页面,登录后它重定向到给定的 redirect_url 以及 id_token 就像
http://example.com/#id_token=eyJraWQiOiJvYzVvK3pwRTFrRHJFYmE0
...
我无法在我的 php 代码中获取 #id_token,我需要在其中验证并加载我的 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("");
}
}
我正在尝试使用一些过滤器来覆盖 AWS Cognito 托管的 WordPress 登录内容 UI
经过多次实验后发现我应该使用不同的方法通过后端 API 调用来执行登录。以下是要遵循的步骤
- 用户
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;
}
}
解码响应 JSON json_decode($jwt)
获取 public 键像下面的方法
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'));
}
- 使用类似
的代码验证并提取有效负载
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 class 可以取自 https://github.com/fproject/php-jwt
因为它不是 firebase\php-jwt
的一部分
我正在尝试将 AWS Cognito 托管 UI 与 WordPress 一起使用。我成功加载了登录页面,登录后它重定向到给定的 redirect_url 以及 id_token 就像
http://example.com/#id_token=eyJraWQiOiJvYzVvK3pwRTFrRHJFYmE0
...
我无法在我的 php 代码中获取 #id_token,我需要在其中验证并加载我的 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("");
}
}
我正在尝试使用一些过滤器来覆盖 AWS Cognito 托管的 WordPress 登录内容 UI
经过多次实验后发现我应该使用不同的方法通过后端 API 调用来执行登录。以下是要遵循的步骤
- 用户
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;
}
}
解码响应 JSON
json_decode($jwt)
获取 public 键像下面的方法
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'));
}
- 使用类似 的代码验证并提取有效负载
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 class 可以取自 https://github.com/fproject/php-jwt 因为它不是 firebase\php-jwt
的一部分