Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从AWS Cognito重定向url中提取id_令牌_Php_Wordpress_Aws Cognito - Fatal编程技术网

Php 如何从AWS Cognito重定向url中提取id_令牌

Php 如何从AWS Cognito重定向url中提取id_令牌,php,wordpress,aws-cognito,Php,Wordpress,Aws Cognito,我正在尝试将AWS Cognito托管的UI与WordPress一起使用。我成功加载登录页面,并在登录后将其重定向到给定的重定向url以及id_令牌,如 http://example.com/#id_token=eyJraWQiOiJvYzVvK3pwRTFrRHJFYmE0 我无法在我的php代码中获取#id#令牌,我需要在这里验证并加载我的wordpress php站点本地用户 非常感谢您的帮助 下面是我的插件代码 <?php global $login_page; $login_p

我正在尝试将AWS Cognito托管的UI与WordPress一起使用。我成功加载登录页面,并在登录后将其重定向到给定的重定向url以及id_令牌,如

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

我无法在我的php代码中获取#id#令牌,我需要在这里验证并加载我的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("");
    }
}

在做了多次实验之后,我发现我应该使用不同的方法通过后端API调用执行登录。以下是要遵循的步骤

  • 用户
    response\u type=code
    这将使用授权代码和使用代码进行响应,以获取令牌[id\u令牌、访问\u令牌、刷新\u令牌]
  • 解码对JSON的响应
    JSON\u decode($jwt)

  • 像下面的方法一样获取公钥

  • 使用类似以下代码验证和提取有效负载
  • 请注意,JWK类可以从
    由于它不是firebase\php jwt的一部分

    您是否尝试过使用
    $\u GET[“id\u token”]
    ?发布您迄今为止为解决此问题所做的工作的代码
    $\u GET[“id\u token”]
    不起作用,我在会话/cokkie/GET参数中看不到
    id\u token
    ,我可以在
    之后告诉您任何事情,这被称为片段,未发送到服务器。另请参见这意味着PHP永远无法获取该数据。我不能说你是如何处理的。但是这就是为什么它不在
    $\u REQUEST
    或任何超级全局数组中的原因,抱歉。这里有一篇关于片段的更好的帖子。。也许你唯一能做的就是在客户端使用它,或者通过AJAX传递它,虽然它过于复杂和混乱。
    
    
        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;
            }
        }
    
    
    
    
        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());
                }
            }