Go 客户端访问 GAE 登录所需的应用程序

Posted

技术标签:

【中文标题】Go 客户端访问 GAE 登录所需的应用程序【英文标题】:Go client to access GAE login required apps 【发布时间】:2018-07-19 23:01:53 【问题描述】:

我想在 app.yaml 中指定 login: requiredlogin: 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 身份验证/授权有所不同。

Users Go API Overview google.golang.org/appengine/user package document user.Current() implementation(适用于 flex 环境,但在标准环境中几乎相同)

更新:经过一些研究,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 登录令牌的包

HTTP 400 错误的请求!解决追加悬赏!

HTTP请求错误40040140240340440540640741241450

您指定的网页无法访问! 错误类型:403

创建命名管道 (WCF) 所需的最低操作系统权限

Sitecore 登录所需的最低角色和访问权限