Go App Engine oauth2 请求

huangapple go评论85阅读模式
英文:

Go App engine oauth2 request

问题

我一直在尝试在App Engine服务器上使用Go实现OAuth2。以下是代码(按照示例):

oauthConf, err := google.NewServiceAccountJSONConfig(
    "./key.json",
    "https://www.googleapis.com/auth/adsense.readonly",
)
if err != nil {
    log.Fatal(err)
}

client := http.Client{Transport: oauthConf.NewTransport()}
resp, err := client.Get(urlStr)
...

然后我收到了错误消息:

在App Engine中无法使用http.DefaultTransport和http.DefaultClient。

我很确定json.key文件是有效的,其他方面也没问题。

通过谷歌搜索,我了解到最好使用urlfetch,但我无法弄清楚如何设置oauth2配置。

英文:

I've been trying to implement [OAuth2 for Go][1] with App engine server to server request.

Here is the code (following the example):

oauthConf, err := google.NewServiceAccountJSONConfig(
	"./key.json",
	"https://www.googleapis.com/auth/adsense.readonly",
)
if err != nil {
	log.Fatal(err)
}

client := http.Client{Transport: oauthConf.NewTransport()}
resp, err := client.Get(urlStr)
...

And I get the error message:

> http.DefaultTransport and http.DefaultClient are not available in App Engine.

I'm pretty sure the json.key file is valid as for the other stuff

Googling lead me to understand that it is preferred to use urlfetch, but I can't figure out how to make the setup with the oauth2 config.

[1]: https://github.com/golang/oauth2 "OAuth2 for Go"

答案1

得分: 0

NewServiceAccountJSONConfig 返回一个 oauth2.JWTConfig 对象。你正在使用它的 .NewTransport() 方法。默认情况下,它使用 http.DefaultTransport,但在 appengine 上不支持。如果可能的话,我建议你使用 AppEngineConfig。具体用法可以参考 http://godoc.org/github.com/golang/oauth2/google

以下是使用 AppEngineConfig 的示例代码:

c := appengine.NewContext(nil)
config := google.NewAppEngineConfig(c, "https://www.googleapis.com/auth/bigquery")
// 下面的 client 将会使用 App Engine 应用的服务账号来授权访问指定的范围。
client := http.Client{Transport: config.NewTransport()}
client.Get("...")

如果你必须使用 ServiceAccountJSONConfig,也是可以的,但你需要使用 urlfetchClientTransport。可以参考一下 AppEngineConfig 的设置方式:https://github.com/golang/oauth2/blob/master/google/appengine.go。

英文:

The NewServiceAccountJSONConfig returns a oauth2.JWTConfig
https://github.com/golang/oauth2/blob/master/google/google.go#L69-L87

Its .NewTransport() you are using:
https://github.com/golang/oauth2/blob/master/jwt.go#L86-L88

Defaults to the http.DefaultTransport, that is not supported on appengine:
https://github.com/golang/oauth2/blob/master/jwt.go#L163-L168

I would go for using the AppEnigneConfig instead (if possible). See http://godoc.org/github.com/golang/oauth2/google

c := appengine.NewContext(nil)
config := google.NewAppEngineConfig(c, "https://www.googleapis.com/auth/bigquery")
// The following client will be authorized by the App Engine
// app's service account for the provided scopes.
client := http.Client{Transport: config.NewTransport()}
client.Get("...")

Otherwise if you need to use ServiceAccountJSONConfig, you probably can, but you'll need to use urlfetch Client and Transport. Have a look how AppEngineConfig is set up: https://github.com/golang/oauth2/blob/master/google/appengine.go

huangapple
  • 本文由 发表于 2014年10月31日 04:34:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/26662738.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定