Martini oauth2callback在适应GAE后重定向到oauth2error

时间:2014-12-13 13:31:06

标签: google-app-engine go oauth-2.0 facebook-oauth martini

下面的代码在本地服务器上完美运行,但是当适应Google应用引擎时(func main更改为init并且包名称从main设置为test app)oauth2callback请求不再工作,请求下面的请求被重定向到oauth2error处理程序

http://testapp.com/oauth2callback?code=OAUTHRESPONSEFROMFACEBOOK&state=%2F

package testapp

import (
    "github.com/go-martini/martini"
    goauth2 "github.com/golang/oauth2"
    "github.com/martini-contrib/oauth2"
    "github.com/martini-contrib/sessions"
    "net/http"
)

func init() {
    m := martini.Classic()
    m.Use(sessions.Sessions("my_session", sessions.NewCookieStore([]byte("secret123"))))
    m.Use(oauth2.Facebook(
        goauth2.Client("AppID", "AppSecret"),
        goauth2.RedirectURL("http://testapp.com/oauth2callback"),
        goauth2.Scope("email,user_birthday,user_friends,publish_actions,user_location,user_photos"),
    ))
    // Tokens are injected to the handlers
    m.Get("/", func(tokens oauth2.Tokens) string {
        if tokens.Expired() {
            return "not logged in, or the access token is expired"
        }
        return "logged in"
    })

    // Routes that require a logged in user
    // can be protected with oauth2.LoginRequired handler.
    // If the user is not authenticated, they will be
    // redirected to the login path.
    m.Get("/restrict", oauth2.LoginRequired, func(tokens oauth2.Tokens) string {
        return tokens.Access()
    })

    http.Handle("/", m)
}

1 个答案:

答案 0 :(得分:0)

我的猜测是你需要将App Engine上下文注入Get方法。

根据Go Martini回购中的this issue,你可以这样做:

func AppEngine(m martini.Context, r *http.Request) {
    m.MapTo(appengine.NewContext(r), (*appengine.Context)(nil))
}

func init() {
    m := martini.Classic()
    m.Use(AppEngine)

    // ...

    m.Get("/", func(tokens oauth2.Tokens, c appengine.Context) string {
        if tokens.Expired() {
            return "not logged in, or the access token is expired"
        }
        return "logged in"
    })

    m.Get("/restrict", oauth2.LoginRequired, func(tokens oauth2.Tokens, c appengine.Context) string {
        return tokens.Access()
    })
}