适用于旧版捆绑服务的 Users API

Users API 允许应用执行以下操作:

  • 检测当前用户是否已登录。
  • 将用户重定向到相应的登录页面进行登录。
  • 要求您的应用用户创建新的 Google 账号(如果用户尚无 Google 账号)。

用户登录应用后,应用可以访问用户的电子邮件地址。应用还可以检测当前用户是否为管理员(也称为“管理员用户”),从而轻松实现仅管理员能够访问的应用区域。

Java 8 中的用户身份验证

以下示例在用户登录后向其展示个性化消息和退出登录链接。如果用户没有登录,则应用会提供 Google 账号的登录页面链接。

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


package com.example.appengine.users;

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

// With @WebServlet annotation the webapp/WEB-INF/web.xml is no longer required.
@WebServlet(
    name = "UserAPI",
    description = "UserAPI: Login / Logout with UserService",
    urlPatterns = "/userapi"
)
public class UsersServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    UserService userService = UserServiceFactory.getUserService();

    String thisUrl = req.getRequestURI();

    resp.setContentType("text/html");
    if (req.getUserPrincipal() != null) {
      resp.getWriter()
          .println(
              "<p>Hello, "
                  + req.getUserPrincipal().getName()
                  + "!  You can <a href=\""
                  + userService.createLogoutURL(thisUrl)
                  + "\">sign out</a>.</p>");
    } else {
      resp.getWriter()
          .println(
              "<p>Please <a href=\"" + userService.createLoginURL(thisUrl) + "\">sign in</a>.</p>");
    }
  }
}

User Service API 可将当前用户的信息返回为 User 对象。虽然 User 对象可以作为属性值存储在数据存储区中,但我们强烈建议您不要这样做,因为此操作会将电子邮件地址和用户的唯一 ID 也包含在内。如果用户更改了其电子邮件地址,当您将其存储的旧 User 与新 User 值进行比较时,它们将无法匹配。请改为考虑将 User 用户 ID 值用作用户的固定唯一标识符。

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

如果您希望用户只有在登录后才能访问某些页面,可在部署描述符(web.xml 文件)中为这些页面建立安全约束。如果用户访问具有安全约束的网址,并且用户没有登录,则 App Engine 会自动将用户重定向到登录页面(登录 Google 账号或进行 Google Workspace 身份验证),然后在成功登录或注册后,将用户重新导回到该网址。

安全限制条件还可以要求用户必须是应用的注册管理员;也就是说,用户必须具有 Viewer、Editor、Owner 或 App Engine Admin 角色。这样一来,您无需实现单独的授权机制,即可构建仅限管理员访问的网站区域。

如需了解如何为网址设置安全约束,请参阅 web.xml“部署描述符:安全和身份验证”

身份验证选项

您的应用可以使用以下选项之一来验证身份用户:

  • Google 账号
  • 您的 Google Workspace 网域中的账号

选择身份验证选项

在创建应用后,您可以选择要使用的身份验证选项。默认情况下,您的应用将使用 Google 账号进行身份验证。如需选择其他选项(如 Google Workspace 网域),请在 Google Cloud 控制台中前往项目的设置页面,然后点击修改。在“Google 身份验证”下拉菜单中,选择所需的身份验证类型,然后点击保存

登录和退出登录

应用可以检测用户是否已使用应用所选的身份验证选项来登录应用。如果用户没有登录,则应用可以将用户定向到 Google 账号进行登录或者创建新的 Google 账号。应用通过调用 Users API 的方法获取登录页面的网址。当用户访问需要进行身份验证的页面时,应用可以将此网址显示为链接,也可以发出到此网址的 HTTP 重定向。

如果您的应用使用 Google 账号或 Google Workspace 进行身份验证,则应用的名称会在用户登录您的应用时显示在登录页面。所显示的名称是您在注册应用时指定的应用名称。您可以在 Google Cloud 控制台凭据页面的应用名称字段中更改此名称。

用户登录或创建 Google 账号后,会被重定向回您的应用。应用提供了指向生成登录网址的方法的重定向网址。

Users API 还提供一个生成网址供退出应用登录的方法。退出登录网址会从应用中撤消用户的身份验证,然后重定向回应用网址,但不显示任何内容。

用户只有在应用提示登录,并输入其账号的电子邮件地址和密码后,才能登录应用。即使用户已使用 Google 账号登录其他应用,也是如此。

访问账号信息

当用户登录应用时,应用可以访问其账号的电子邮件地址,以获取用户对应用发出的每个请求。应用还可以访问唯一标识用户的用户 ID,即使用户更改了账号的电子邮件地址也是如此。

应用还可以确定当前用户是否为应用的管理员。“管理员”用户是指具有 Viewer、Editor、Owner 或 App Engine Admin 角色的任何用户。即使您不验证其他用户的身份,也可以使用此功能为应用创建管理功能。通过 Go、Java、PHP 和 Python API,可以轻松将网址配置为“仅限管理员访问”。

用户和数据存储区

Users Service API 可将当前用户的信息返回为 User 对象。虽然 User 对象可以作为属性值存储在数据存储区中,但我们强烈建议您不要这样做,因为此操作会将电子邮件地址和用户的唯一 ID 也包含在内。如果用户更改了其电子邮件地址,当您将其存储的旧 User 与新 User 值进行比较时,它们将无法匹配。请改为考虑将 User 用户 ID 值用作用户的固定唯一标识符。

Google 账号和开发服务器

开发服务器使用虚构登录屏幕来模拟 Google 账号系统。当应用调用 Users API 以获取登录屏幕网址时,该 API 会返回一个特殊开发服务器网址来提示用户输入电子邮件地址,但不提示输入密码。您可以在此提示中输入任何电子邮件地址,而应用将表现得就像您使用了拥有该地址的账号进行了登录。

虚构登录屏幕还提供一个复选框,用于指明虚构账号是否为管理员;也就是说,该账号是否具有 Viewer、Editor、Owner 或 App Engine Admin 角色。如果您勾选此复选框,则应用将表现得就像您使用了管理员账号进行了登录。

同样,Users API 返回一个用于取消虚构登录的退出登录网址。