我不是 Google 登录 API 方面的专家,但是据我所知,该 API 纯粹用于验证目的,并且(据我所知,我可能是错的)不是实际的用户会话。与用户帐户相关的所有其他事情(IE,在您的情况下存储和保持登录会话)都由您(开发人员)处理。基本身份验证支持在登录成功时调用回调函数 via data-onsuccess,它在登录时调用带有相关登录信息的 JavaScript 函数。当用户登录时,标准做法是验证返回的用户令牌的有效性,然后您可以对数据进行所需的操作。在这种情况下,您将为用户启动某种会话。
一个非常基本的例子如下:
主页
<!DOCTYPE html>
<html>
<head>
<title>Test Home</title>
</head>
<body>
<a href="/login">Login</a><br>
<a href="/profile">Profile</a>
</body>
</html>
这有 2 个链接,一个用于个人资料,一个用于登录页面。
登录/index.php
<!DOCTYPE html>
<html>
<head>
<title>Test Login</title>
<meta name="google-signin-client_id" content="YOUR-CLIENT-ID.apps.googleusercontent.com">
</head>
<body>
<div class="g-signin2" data-onsuccess="onLoginSuccess"></div>
<script type="text/javascript">
function onLoginSuccess(user) {
var user_id_token = user.getAuthResponse().id_token,
request = new XMLHttpRequest();
request.open('POST', 'https://www.googleapis.com/oauth2/v3/tokeninfo');
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
request.onload = function() {
authUser(request.responseText);
};
request.send('id_token=' + user_id_token);
}
function authUser(userData) {
var request = new XMLHttpRequest();
request.open('POST', '/login/login.php');
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
request.onload = function() {
if (request.responseText == 'true') {
location.href = "/";
}
};
request.send('user_data=' + userData);
}
</script>
<script src="https://apis.google.com/js/platform.js" async defer></script>
</body>
</html>
这样做是创建一个非常基本的登录按钮。该按钮有一个回调,onLoginSuccess当用户使用 Google 登录时会调用该回调。然后它通过获取用户令牌user.getAuthResponse().id_token并发出一个发布请求以https://www.googleapis.com/oauth2/v3/tokeninfo验证令牌(这可以在您的后端本地完成,Google 为其提供了库。但是使用 API 端点要容易得多)。一旦通过验证,它将响应数据发送到authUser另一个函数,然后将其传递给后端 ( /login/login.php) 以实际启动用户会话。
登录/login.php
<?php
session_start();
$user_data = json_decode($_POST['user_data']);
$_SESSION['user_data'] = $user_data;
echo 'true';
login.php只需启动一个会话,获取发布的数据,并将用户会话设置为发布的数据。然后它会回true显,以便 JavaScript 知道它已完成。JavaScript 然后将用户发送回主页。
配置文件/index.php
<?php
session_start();
if (!isset($_SESSION['user_data'])) {
header('Location: /login');
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Test Profile</title>
</head>
<body>
<img src=<?php echo $_SESSION['user_data']->picture; ?>><br>
<b>Welcome! <?php echo $_SESSION['user_data']->name; ?></b><br>
<a href="/login/logout.php">Sign out</a>
</body>
</html>
该页面所做的是首先检查user_data会话是否已设置。如果未设置(意味着用户尚未登录),则将其重定向回主页。如果已设置(表示他们已登录),则会显示图片和用户名,并有一个logout按钮。单击此按钮时,它只会将用户带到/login/logout.php.
登录/注销.php
<?php
session_start();
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-3600, '/');
}
session_destroy();
header('Location: /');
它所做的只是删除用户的所有会话数据,首先删除会话 cookie,然后销毁实际会话。然后它会引导他们回到主页。现在单击profile将不允许他们查看任何内容,因为他们已注销,并且只会在他们重新登录时显示数据。
这只是使用 Google API 处理用户会话的一种非常基本且粗略的方法。有更好的方法(因为这个例子在后端没有真正的验证,当浏览器关闭时会话被终止,所以 cookie 可能对你更好),但是这是处理用户会话的一般基础。