簡體   English   中英

如何從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托管UI覆蓋WordPress登錄內容

經過多次實驗,結果證明我應該使用不同的方法通過后端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的一部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM