My favorites | 中文(简体) | Sign in

Google 帐户 Java API 概述

App Engine 应用程序可以使用 Google 帐户验证用户。应用程序可以检测到当前用户是否以 Google 帐户登录,并且可以将用户重定向到 Google 帐户登录页面,以便登录或新建一个帐户。用户登录应用程序后,应用程序可以访问用户的电子邮件地址。应用程序也可以检测当前用户是否为管理员,这样便可在应用程序中轻松实现仅管理员区域。

Google 帐户集成是 App Engine 的一个可选功能。如果您不希望将应用程序与 Google 帐户集成,可以始终构建自己的系统来进行用户验证。Google 帐户提供了一种稳固、易用的验证机制,它拥有一套成熟的功能且数百万的活动用户。

在 Java 中使用 Google 帐户

您可以通过请求对象的 getUserPrincipal() 方法测试用户是否使用 Google 帐户登录,并获得使用标准 servlet API 的用户电子邮件地址。您可以使用用户服务 API 来生成登录和退出网址。

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        UserService userService = UserServiceFactory.getUserService();

        String thisURL = request.getRequestURI();
        if (request.getUserPrincipal() != null) {
            response.getWriter().println("<p>Hello, " +
                                         request.getUserPrincipal().getName() +
                                         "!  You can <a href=\"" +
                                         userService.createLogoutURL(thisURL) +
                                         "\">sign out</a>.</p>");
        } else {
            response.getWriter().println("<p>Please <a href=\"" +
                                         userService.createLoginURL(thisURL) +
                                         "\">sign in</a>.</p>");
        }
    }
}

用户服务 API 可返回当前用户的信息作为 User 对象。User 对象可以作为属性值存储在数据存储区中。

使用 web.xml 强制登录和管理访问

如果有的页面用户不登录就无法访问,那么您可以在部署描述符(web.xml 文件)中为这些页面建立一个安全约束。如果用户通过安全约束访问网址,且用户没有登录,那么 App Engine 会自动将用户重定向到 Google 帐户登录页面,然后在成功登录或注册后将用户引导回该网址。

安全约束也可以要求用户是应用程序的注册管理员。这样易于实现网站的仅管理员部分,而不必实现一个单独的授权机制。

要了解如何设置网址的安全约束,请参阅部署描述符:安全和验证

登录和退出

应用程序可以检测用户是否以 Google 帐户登录到应用程序。如果用户没有登录,则应用程序可以将用户导向 Google 帐户登录页面,以便登录或新建一个 Google 帐户。应用程序通过调用用户 API 的一个方法来获取 Google 帐户登录屏幕的网址。应用程序可以将此网址显示为链接,或者在用户访问一个需要验证的页面时发出对该网址的 HTTP 重定向。

Google 帐户登录屏幕通知用户,正使用您在注册应用程序时所选择的应用程序名称登录到应用程序。您可以在管理控制台的“应用程序设置”部分中更改应用程序的名称。

用户在登录或创建 Google 帐户后,将被重定向回应用程序。应用程序对方法提供重定向网址,以生成登录网址。

用户 API 还包含一种方法,用来生成用于退出应用程序的网址。退出网址从应用程序中取消用户的验证,然后重定向返回到应用程序的网址,不显示任何内容。

用户只有经应用程序提示登录,并输入帐户电子邮件地址和密码,才能登录到应用程序。即使用户已使用 Google 帐户登录到其他应用程序,也是如此。

访问帐户信息

当用户登录到应用程序时,应用程序可以针对用户向应用程序发出的每个请求来访问帐户的电子邮件地址。

应用程序也可以确定当前用户是否是应用程序的管理员(“开发人员”)。即使您不使用 Google 帐户来验证其他用户,也可以使用此功能来构建应用程序的管理功能。通过 Java 和 Python API 能够轻松地将网址配置为“仅管理员”。

用户和数据存储区

App Engine 数据存储区支持将 Google 帐户 API 返回的用户对象存储为特殊值类型。就本文而言,用户值对用户而言不是稳定的标识符:如果应用程序存储用户值,而用户更改了其电子邮件地址,则用户值将不再引用有效的用户。实际上,用户很少更改其 Google 帐户电子邮件地址,但是仍然需要针对这些偶然情况进行设计。将来对服务的更新可能会自动更新数据存储区中的用户值。到那时,最好的做法是不依赖用户值来保持稳定性。

Java API 当前不在电子邮件以外公开唯一的用户 ID。

Google 帐户和开发服务器

开发服务器使用虚拟登录屏幕来模拟 Google 帐户系统。当应用程序调用用户 API 来获取登录屏幕的网址时,API 将返回一个特殊的开发服务器网址,它将提示输入电子邮件地址,但不提示输入密码。您可以在此提示中键入任何电子邮件地址,应用程序将认为您以该地址的帐户进行了登录。

虚拟登录屏幕还包含一个复选框,用于指示虚拟帐户是否为管理员。如果选中该复选框,应用程序将认为您使用管理员帐户进行了登录。

同样,用户 API 返回取消虚拟登录的退出网址。