猿问

为 OAuth2 提供程序正确的 AppEngine Golang 包

使用 OAuth 的正确方法是什么


如果我使用context.Contextfrom golang.org/x/net/context,错误是:


"golang.org/x/net/context".Context does not implement "appengine".Context (missing Call method)

但如果我appengine.Context从appengine(SDK)使用,错误是:


cannot use oauth2.NewClient(c) (type *http.Client) as type "golang.org/x/net/context".Context in argument to provider.Client:

*http.Client does not implement "golang.org/x/net/context".Context (missing Deadline method)

如果我使用oauth2.NoContext,运行时错误是


Post https://accounts.google.com/o/oauth2/token: not an App Engine context

都使用 Go 1.4 和 1.7b3 进行了测试


使用这段代码:


func Public_YoutubeOauth(w http.ResponseWriter, r *http.Request) {

    c := appengine.NewContext(r)

    provider, csrf := getOAuth(r)

    gets, err := url.ParseQuery(r.URL.RawQuery)

    if RenderHtmlIfError(w,err) {

        return

    }

    if csrf != gets.Get(`state`) {

        RenderHtmlError(w,`incorrect CSRF state`)

        return

    }

    code := gets.Get(`code`)

    token, err := provider.Exchange(c, code) // error here

    if RenderHtmlIfError(w,err) {

        return

    }

    RenderHtml(w,`page`,map[string]interface{`token`:token})

}

是provider:


&oauth2.Config{

        ClientID:     `aaa`,

        ClientSecret: `bbb`,

        RedirectURL:  url + `/foo/youtube_oauth`,

        Scopes: []string{

            `openid`,

            `email`,

            `profile`,

            `https://www.googleapis.com/auth/youtube`,

        },

        Endpoint: google.Endpoint,

    }

解决这个问题的正确方法是什么?


一只萌萌小番薯
浏览 198回答 1
1回答

温温酱

解决方案:将所有"appengine导入更改为"google.golang.org/appengine继续使用context.Context(from golang.org/x/net/context) 而不是appengine.Context
随时随地看视频慕课网APP

相关分类

Go
我要回答