用户登录应用后,应用可以访问用户的电子邮件地址。应用还可以检测当前用户是否为管理员(也称为“管理员用户”),从而轻松实现仅管理员能够访问的应用区域。如需查看 user 软件包的内容,请参阅 user 软件包参考文档。
Go 1.11 中的用户身份验证
以下示例在用户登录后向其展示个性化问候消息和一个退出登录的链接。如果用户没有登录,则应用会提供 Google 账号的登录页面链接。
import("fmt""net/http""google.golang.org/appengine""google.golang.org/appengine/user")funcwelcome(whttp.ResponseWriter,r*http.Request){w.Header().Set("Content-type","text/html; charset=utf-8")ctx:=appengine.NewContext(r)u:=user.Current(ctx)ifu==nil{url,_:=user.LoginURL(ctx,"/")fmt.Fprintf(w,`<a href="%s">Sign in or register</a>`,url)return}url,_:=user.LogoutURL(ctx,"/")fmt.Fprintf(w,`Welcome, %s! (<a href="%s">sign out</a>)`,u,url)}
import("fmt""net/http""google.golang.org/appengine""google.golang.org/appengine/user")funcwelcomeOAuth(whttp.ResponseWriter,r*http.Request){ctx:=appengine.NewContext(r)u,err:=user.CurrentOAuth(ctx,"")iferr!=nil{http.Error(w,"OAuth Authorization header required",http.StatusUnauthorized)return}if!u.Admin{http.Error(w,"Admin login only",http.StatusUnauthorized)return}fmt.Fprintf(w,`Welcome, admin user %s!`,u)}
身份验证选项
您的应用可以使用以下选项之一来验证身份用户:
Google 账号
您的 Google Workspace 网域中的账号
选择身份验证选项
在创建应用后,您可以选择要使用的身份验证选项。默认情况下,您的应用将使用 Google 账号进行身份验证。如需选择其他选项(如 Google Workspace 网域),请在 Google Cloud 控制台中前往项目的设置页面,然后点击修改。在“Google 身份验证”下拉菜单中,选择所需的身份验证类型,然后点击保存。
登录和退出登录
应用可以检测用户是否已使用应用所选的身份验证选项来登录应用。如果用户没有登录,则应用可以将用户定向到 Google 账号进行登录或者创建新的 Google 账号。应用通过调用 Users API 的方法获取登录页面的网址。当用户访问需要进行身份验证的页面时,应用可以将此网址显示为链接,也可以发出到此网址的 HTTP 重定向。
如果您的应用使用 Google 账号或 Google Workspace 进行身份验证,则应用的名称会在用户登录您的应用时显示在登录页面。所显示的名称是您在注册应用时指定的应用名称。您可以在 Google Cloud 控制台凭证页面的应用名称字段中更改此名称。
用户登录或创建 Google 账号后,会被重定向回您的应用。应用提供了指向生成登录网址的方法的重定向网址。
Users API 还提供一个生成网址供退出应用登录的方法。退出登录网址会从应用中撤消用户的身份验证,然后重定向回应用网址,但不显示任何内容。
用户只有在应用提示登录,并输入其账号的电子邮件地址和密码后,才能登录应用。即使用户已使用 Google 账号登录其他应用,也是如此。
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["很难理解","hardToUnderstand","thumb-down"],["信息或示例代码不正确","incorrectInformationOrSampleCode","thumb-down"],["没有我需要的信息/示例","missingTheInformationSamplesINeed","thumb-down"],["翻译问题","translationIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2025-08-20。"],[[["\u003cp\u003eThe Users API allows applications to check if a user is signed in, redirect them to sign-in pages, and request new Google account creation if needed.\u003c/p\u003e\n"],["\u003cp\u003eApplications can access a signed-in user's email address and determine if the user is an administrator, simplifying the creation of admin-only sections.\u003c/p\u003e\n"],["\u003cp\u003eAuthentication can be enforced at the URL level in the \u003ccode\u003eapp.yaml\u003c/code\u003e file, requiring users to be signed in or be administrators to access certain pages.\u003c/p\u003e\n"],["\u003cp\u003eOAuth can be used for user identification, offering an alternative to standard authentication methods, but pages requiring standard login will not load if only OAuth authentication is used.\u003c/p\u003e\n"],["\u003cp\u003eThe development server simulates Google Accounts with a fake sign-in, allowing any email address to be used, and providing a checkbox to indicate administrator status for testing.\u003c/p\u003e\n"]]],[],null,["# Users API for legacy bundled services\n\nThe Users API allows an application to:\n\n- Detect whether the current user has signed in.\n- Redirect the user to the appropriate sign-in page to sign in.\n- Request that your application user create a new Google account if they don't have one already.\n\n| This API is supported for first-generation runtimes and can be used when [upgrading to corresponding second-generation runtimes](/appengine/docs/standard/\n| go\n| /services/access). If you are updating to the App Engine Go 1.12+ runtime, refer to the [migration guide](/appengine/migration-center/standard/migrate-to-second-gen/go-differences) to learn about your migration options for legacy bundled services.\n\nWhile a user is signed in to the application, the app can access the user's\nemail address.\nThe app can also detect whether the current user is an\nadministrator (also called \"admin user\"),\nmaking it easy to implement admin-only areas of the app. To\nview the contents of the `user` package, see the\n[`user` package reference](/appengine/docs/legacy/standard/go111/users/reference).\n| **Note:** An *admin* user is any user that has the Viewer, Editor, Owner, or App Engine Admin [role](https://cloud.google.com/appengine/docs/legacy/standard/go111/roles). For more information on setting user roles, see [Roles that Grant Access to\n| App Engine](/appengine/docs/legacy/standard/go111/access-control).\n\nUser authentication in Go 1.11\n------------------------------\n\nThe following example greets a user who has signed in to the app with a\npersonalized message and a link to sign out. If the user is not signed in, the\napp offers a link to the sign-in page for Google Accounts. \n\n import (\n \t\"fmt\"\n \t\"net/http\"\n\n \t\"google.golang.org/appengine\"\n \t\"google.golang.org/appengine/user\"\n )\n\n func welcome(w http.ResponseWriter, r *http.Request) {\n \tw.Header().Set(\"Content-type\", \"text/html; charset=utf-8\")\n \tctx := appengine.NewContext(r)\n \tu := user.Current(ctx)\n \tif u == nil {\n \t\turl, _ := user.https://cloud.google.com/appengine/docs/legacy/standard/go111/reference/latest/user.html#google_golang_org_appengine_user_LoginURL(ctx, \"/\")\n \t\tfmt.Fprintf(w, `\u003ca href=\"%s\"\u003eSign in or register\u003c/a\u003e`, url)\n \t\treturn\n \t}\n \turl, _ := user.https://cloud.google.com/appengine/docs/legacy/standard/go111/reference/latest/user.html#google_golang_org_appengine_user_LogoutURL(ctx, \"/\")\n \tfmt.Fprintf(w, `Welcome, %s! (\u003ca href=\"%s\"\u003esign out\u003c/a\u003e)`, u, url)\n }\n\n### Enforcing sign in and admin access with app.yaml\n\nIf you have pages that require the user to be signed in order to\naccess, you can enforce this in your `app.yaml`\nfile.\n\n\u003cbr /\u003e\n\nThe handler configuration can also require that the user be a\nregistered administrator for the application; that is, the user must have the\nViewer, Editor, Owner, or App Engine Admin\n[role](https://cloud.google.com/appengine/docs/legacy/standard/go111/roles).\nThis makes it easy to build administrator-only sections of the site, without\nhaving to implement a separate authorization mechanism.\n\nTo learn how to configure authentication for URLs, see how to require login or\nadministrator status in the\n[`app.yaml` reference](/appengine/docs/legacy/standard/go111/config/appref#handlers_login).\n\nOAuth in Go\n-----------\n\nIn addition to the standard user authentication modes, users may be identified\nto your app via OAuth. OAuth is a protocol that allows a user to grant a third\nparty limited permission to access a web application on their behalf,\nwithout sharing their credentials (username and password) with the third\nparty. More information on the OAuth API, including the interaction required by\nclients, can be found in the [OAuth documentation](/appengine/docs/legacy/standard/go111/oauth).\n\nNote that using OAuth to identify your users is completely orthogonal to the\nstandard user authentication modes. For example, pages marked with\n`login: required` or `login: admin` will refuse to load if the user is only\nauthenticated via OAuth.\n\nHere is a simple example of accessing OAuth user information in a Go request\nhandler: \n\n import (\n \t\"fmt\"\n \t\"net/http\"\n\n \t\"google.golang.org/appengine\"\n \t\"google.golang.org/appengine/user\"\n )\n\n func welcomeOAuth(w http.ResponseWriter, r *http.Request) {\n \tctx := appengine.NewContext(r)\n \tu, err := user.CurrentOAuth(ctx, \"\")\n \tif err != nil {\n \t\thttp.Error(w, \"OAuth Authorization header required\", http.StatusUnauthorized)\n \t\treturn\n \t}\n \tif !u.Admin {\n \t\thttp.Error(w, \"Admin login only\", http.StatusUnauthorized)\n \t\treturn\n \t}\n \tfmt.Fprintf(w, `Welcome, admin user %s!`, u)\n }\n\nAuthentication options\n----------------------\n\nYour app can authenticate users using one of these options:\n\n- A Google Account\n- An account on your Google Workspace domain\n\n### Choosing an authentication option\n\nAfter you create your app, you can choose the authentication option you want to\nuse. By default, your app will use Google Accounts for authentication. To choose\nanother option, such as Google Workspace domain, go to the\n[settings](https://console.cloud.google.com/appengine/settings) page for your project\nin the Google Cloud console and click **Edit** . In the *Google authentication*\ndropdown menu, select the desired authentication type, and then click **Save**.\n\nSigning in and out\n------------------\n\nAn application can detect whether a user has signed in to the app with your\napp's chosen authentication option. If the user is not signed in, the app can\ndirect the user to Google Accounts to sign in or create a new Google account.\nThe app gets the URL for the sign-in page by calling a method of the Users API.\nThe app can display this URL as a link, or it can issue an HTTP redirect to the\nURL when the user visits a page that requires authentication.\n\nIf your app uses Google Accounts or Google Workspace for authentication,\nthe name of your application appears on the sign-in page when the user signs in\nto your application. The name shown is the application name that you specified\nwhen registering the application. You can change this name in the **Application\nname** field of the Google Cloud console\n[Credentials](https://console.cloud.google.com/apis/credentials/consent) page.\n\nOnce the user has signed in or created a Google account, the user is redirected\nback to your application. The app provides the redirect URL to the method that\ngenerates the sign-in URL.\n\nThe Users API includes a method to generate a URL for signing out of the app.\nThe sign-out URL de-authenticates the user from the app, then redirects back to\nthe app's URL without displaying anything.\n\nA user is not signed in to an application until they are prompted to do so by the\napp and enter their account's email address and password. This is true even if\nthe user has signed in to other applications using their Google Account.\n\nAccessing account information\n-----------------------------\n\nWhile a user is signed in to an app, the app can access the account's email\naddress for every request the user makes to the app. The app can also access a\nuser ID that identifies the user uniquely, even if the user changes the email\naddress for their account.\n\nThe app can also determine whether the current user is an administrator for the\napp. An *admin* user is any user that has the Viewer, Editor, Owner, or App\nEngine Admin\n[role](https://cloud.google.com/appengine/docs/legacy/standard/go111/roles).\nYou can use this feature to build administrative features for the app, even if\nyou don't authenticate other users. The Go, Java, PHP and Python APIs make it\neasy to configure URLs as \"administrator only\".\n| **Note:** Every user has the same user ID for all App Engine applications. If your app uses the user ID in public data, such as by including it in a URL parameter, you should use a hash algorithm with a \"salt\" value added to obscure the ID. Exposing raw IDs could allow someone to associate a user's activity in one app with that in another, or get the user's email address by coercing the user to sign in to another app.\n\nGoogle accounts and the development server\n------------------------------------------\n\nThe development server simulates the Google Accounts system using a fake\nsign-in screen. When your application calls the Users API to get the URL for the\nsign-in screen, the API returns a special development server URL that prompts\nfor an email address, but no password. You can type any email address into this\nprompt, and the app will behave as if you are signed in with an account with\nthat address.\n\nThe fake sign-in screen also includes a checkbox that indicates whether the\nfake account is an administrator; that is, whether the account has the\nViewer, Editor, Owner, or App Engine Admin\n[role](https://cloud.google.com/appengine/docs/legacy/standard/go111/roles). If\nyou check this box, the app will behave as if you are signed in using an\nadministrator account.\n\nSimilarly, the Users API returns a sign-out URL that cancels the fake sign-in."]]