Go 客户端访问 GAE 登录所需的应用程序
Posted
技术标签:
【中文标题】Go 客户端访问 GAE 登录所需的应用程序【英文标题】:Go client to access GAE login required apps 【发布时间】:2018-07-19 23:01:53 【问题描述】:我想在 app.yaml 中指定 login: required
或 login: admin
的 Google App Engine 上使用 golang 客户端针对受保护的应用对自己(Google 帐户)进行身份验证。
首先我编写了一个简单的 OAuth2 离线访问客户端,但它根本不起作用 - 服务器只是将客户端重定向到 Google 帐户的登录页面。我已经尝试过各种 Google API 范围,但目前没有运气。
package main
import (
"context"
"fmt"
"io"
"log"
"os"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
)
const (
AppURL = "https://login-requried-app.appspot.com"
AuthClientID = "....."
AuthClientSecret = "....."
AuthRedirectURL = "urn:ietf:wg:oauth:2.0:oob"
AuthScope = "https://www.googleapis.com/auth/cloud-platform"
)
func main()
ctx := context.Background()
conf := &oauth2.Config
ClientID: AuthClientID,
ClientSecret: AuthClientSecret,
Endpoint: google.Endpoint,
RedirectURL: AuthRedirectURL,
Scopes: []stringAuthScope,
url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)
fmt.Printf("Visit the URL for the auth dialog: %v\n", url)
fmt.Printf("Enter authentication code: ")
var code string
if _, err := fmt.Scan(&code); err != nil
log.Fatal(err)
tok, err := conf.Exchange(ctx, code)
if err != nil
log.Fatal(err)
client := conf.Client(ctx, tok)
res, err := client.Get(AppURL)
if err != nil
log.Fatal(err)
defer res.Body.Close()
log.Println(res.Status)
io.Copy(os.Stdout, res.Body)
我正在寻找在此类应用程序中使用的 GAE 用户身份验证模式的详细信息,以编写非 Web 浏览器客户端。在阅读 App Engine 用户 API 文档和通过 HTTP 标头(如 X-AppEngine-User-Email
)接收用户信息的代码后,我觉得这与标准 OAuth2 身份验证/授权有所不同。
更新:经过一些研究,GAE 前端似乎使用SACSID
cookie 来跟踪经过身份验证的会话,这与 OAuth2 标准无关。确实如Users Go API document中所述:
请注意,使用 OAuth 来识别您的用户与标准用户身份验证模式完全正交。例如,如果用户仅通过 OAuth 进行身份验证,标有 login: required 或 login: admin 的页面将拒绝加载。
CLI 应用程序是否有任何受支持的方式来获取经用户同意正确授权的SACSID
?
相关问题:
Access an App Engine app from command line using OAuth2? On Google App Engine, can I relate a Google OAuth 2 Token and a SACSID token I got using android's AccountManager?【问题讨论】:
这不是一个答案,但在我看来,你想做 openidconnect 客户端库正在做的事情:developers.google.com/identity/protocols/…。不幸的是,Go 似乎没有一个。 【参考方案1】:鉴于您在此处解释的情况,我建议使用remote API。这样您就可以从 Go 应用访问 App Engine 服务。
首先您必须通过添加以下内容来配置您的app.yaml
文件:
- url: /_ah/remote_api
script: _go_app
您还必须将以下导入添加到您的 .go
源文件中:
import _ "google.golang.org/appengine/remote_api"
完成后,将更新后的应用部署到 App Engine:
gcloud app deploy app.yaml
我在此处包含的网站包含有关如何使用远程 API 的示例。如果这对您有用,您可以尝试并调整您的代码。
【讨论】:
谢谢,我从来没有想出远程 API。它可能对某些任务有用,但显然它不适合我的需要。它不提供对体现应用程序业务逻辑的 Web 服务器处理程序的访问。我不想将它们嵌入 CLI 客户端,因为它需要用户保持更新。 您是否尝试过使用Identity Aware Proxy 来保护您的应用?这样,您可以控制对应用程序的访问,并确保身份验证和授权过程仅适用于适当的用户,而无需依赖外部资源。或者,您也可以使用Cloud Endpoints 来完全控制谁可以使用 JSON Web 令牌和 API 密钥访问您的应用程序。以上是关于Go 客户端访问 GAE 登录所需的应用程序的主要内容,如果未能解决你的问题,请参考以下文章
用于在 GAE 上运行的 Go 中验证 Google 登录令牌的包