1

我正在使用适用于 JavaScript 的 Google 登录客户端 API。我正在处理的网站有两个相关页面。它有一个登录页面,它有一个用户个人资料页面。登录页面上显然有一个 Google 登录按钮。您应该只能在登录时查看您的个人资料页面。当用户在未登录的情况下进入他们的个人资料页面时,它应该将他们重定向到登录页面。

这是我尝试过的一种方法,但不起作用:

// This does not work because this event is only fired when the user logs in or logs out, but not when the user is already logged out.
gapi.auth2.init().isSignedIn.listen(function(state) {
    if(!state) location.href = "/login/";
});

我还尝试在脚本加载时检测用户的登录状态,但这也不起作用。它总是重定向到登录页面,因为在脚本加载完成时,Google API 永远无法让用户登录。

此外,我试图不在我的代码中使用setIntervalor setTimeout,但是,如果这是我唯一有效的选择,请通知我。

顺便说一句,我多次听说我可以在用户登录时设置一个变量,然后如果变量为false. 我什么时候检查所述变量的值?这不起作用,因为它需要我设置一个特定的延迟setTimeout。谷歌的加载时间可能会有很大差异,所以我不会使用它。

4

2 回答 2

3

我发现你可以使用这个简单的表达式来返回true或者false取决于用户是否在你的网站上登录到谷歌。

gapi.auth2.init().isSignedIn.get()
于 2017-06-03T00:34:44.167 回答
2

我不是 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 可能对你更好),但是这是处理用户会话的一般基础。

于 2017-04-17T01:34:04.653 回答