oauth2.0 Google API客户端安全问题?

jdzmm42g  于 2023-04-29  发布在  Go
关注(0)|答案(1)|浏览(201)

我创建了一个网站,要求用户使用Google作为提供商通过Oauth2登录。我使用this作为供应商,我基本上实现了它,因为他们建议你。
基本上流程是:

  • 用户进入安全页面
  • 脚本检查是否存在带有令牌的cookie
  • 发送令牌以进行验证检查
  • 有效时,继续
  • 无效时,发送回登录页面
  • 登录后,通过ID令牌验证检查返回的代码,然后将idtoken保存为cookie
  • 此cookie用于在每次页面加载时验证用户(我们不使用任何其他API调用,仅使用页面加载身份验证)

现在这个脚本已经被审计,审计员已经将这个流标记为“不安全”。说攻击者可以窃取令牌并将其用于自己的利益。我完全理解。
然而,如何防止这种情况?我们需要把代码存起来吗审计员提出了两点建议:将重定向参数不仅发送到授权端点,而且发送到令牌端点。问题是,我相信我已经这样做了。
如果有人能指导我这些安全调查结果,我将非常感激。
授权代码(用于需要用户登录的页面):

if(isset($_POST['Logout'])){
    setcookie($COOKIENAME, "", time() - 3600);
    header("Location: /login.php", true, 301); }

try {
    

    if (!isset($_COOKIE[$COOKIENAME])) {
        header("Location: /login.php", true, 301);
    }
    require_once 'vendor/autoload.php';
    $client = new Google_Client();
    $client->setAuthConfig('./clientInfo.json');

    $redirect_uri = $_SERVER['HTTP_HOST'].'/login.php';
    $client->setRedirectUri($redirect_uri);
    $client->setAccessType('offline');

    $token = $client->verifyIdToken($_COOKIE[$COOKIENAME]);
    if (!$token) {
        header("Location: login.php", true, 301); 
    } 
} catch (Exception $e) {
    print "An error occurred: " . $e->getMessage();
}

验证码(用于回调):

if (isset($_GET['code'])) {
    $client = new Google_Client();
    $client->setAuthConfig('./clientInfo.json');

    $redirect_uri = $_SERVER['HTTP_HOST'].'/login.php';
    $client->setRedirectUri($redirect_uri);
    $client->setAccessType('offline');
    try {
        $token = $client->verifyIdToken(urldecode($_GET['code']));
        if ($token) {
            $userid = $token['sub'];

            $exp = $token['exp'];
            $cookie_name = $COOKIENAME;
            $cookie_value = urldecode($_GET['code']);
            setcookie($cookie_name, $cookie_value, $exp, "/");
            header("Location: dashboard.php");
        } else {
            echo "invalid token";
        }
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }
} else {
    echo "invalid token";
}
oprakyz7

oprakyz71#

您可以使用session而不是cookie来存储令牌。
Cookie存储在客户端浏览器中,每次与服务器通信时发送。黑客可以在浏览器上注入代码来窃取它。他们还可以拦截服务器和客户端之间的通信(如果未加密)以窃取它。
会话在服务器端存储数据。浏览器上仅存储会话ID。黑客无法获得浏览器上的数据,因为它从未发送给他们。

// This line is required to start using session.
session_start();

if (isset($_GET['code'])) {
    $client = new Google_Client();
    $client->setAuthConfig('./clientInfo.json');

    $redirect_uri = $_SERVER['HTTP_HOST'].'/login.php';
    $client->setRedirectUri($redirect_uri);
    $client->setAccessType('offline');
    try {
        $token = $client->verifyIdToken($_GET['code']);
        if ($token) {

            // Store both the code and verified token, if needed.
            $_SESSION['google_code'] = $_GET['code'];
            $_SESSION['google_code_token'] = $token;

            // TODO: Perhaps to use session_get_cookie_params() to set the expiration
            //       or setup other method to validate the token before use.

            header("Location: dashboard.php");
        } else {
            echo "invalid token";
        }
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }
} else {
    echo "invalid token";
}

相关问题