在OAuth中使用AppEngine/Go Users API:代码示例,工作流程,任何帮助?

Ada*_*and 6 google-app-engine oauth go

虽然我对AppEngine/Python运行时非常有经验,但我是Go运行时的新手.我的第一个应用程序已接近准备推出,但我仍需要为用户提供登录功能.我希望使用OpenID,因为我宁愿不要求用户拥有Google ID.

但是,似乎没有或几乎没有工作示例,AppEngine文档明确省略了我需要实现的函数的内容:

func init() {
    http.HandleFunc("/_ah/login_required", openIdHandler)
}

func openIdHandler(w http.ResponseWriter, r *http.Request) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这个openIdHandler功能里面有什么?

据我所知,我需要提供一个页面,允许用户选择众多OpenId提供程序中的一个并为该系统输入其ID.我不知道在那之后该怎么办.什么是工作流程?有没有人知道我可以看到的任何示例代码,以大致了解我必须做什么以及我必须处理哪些数据?我所有精心打造的google-fu都让我无处可去.

需要说明的是,我不打算与这些OpenId提供商提供的任何服务进行互动; 我不想创建Tweets或Buzz.我不想访问联系人,文档,Wall帖子或其他任何内容.我只是想要一个经过身份验证的证书,我可以在我的应用程序中使用它来限制用户只能访问他或她自己的数据.

小智 10

如果我很好理解你-你需要,没有.我为go-lang 重写了python示例(联合登录和注销).希望这有帮助.

package gae_go_openid_demo

import (
    "fmt"
    "os"
    "http"

    "appengine"
    "appengine/user"
)

func init() {
    http.HandleFunc("/", hello)
    http.HandleFunc("/_ah/login_required", openIdHandler)
}

func hello(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    u := user.Current(c)
    if u != nil {
        url, err := user.LogoutURL(c, "/")
        check(err);
        fmt.Fprintf(w, "Hello, %s! (<a href='%s'>Sign out</a>)", u, url)
    } else {
        fmt.Fprintf(w, "Please, <a href='/_ah/login_required'>login</a>.")
    }

}

func openIdHandler(w http.ResponseWriter, r *http.Request) {
    providers := map[string]string {
        "Google"   : "www.google.com/accounts/o8/id", // shorter alternative: "Gmail.com"
        "Yahoo"    : "yahoo.com",
        "MySpace"  : "myspace.com",
        "AOL"      : "aol.com",
        "MyOpenID" : "myopenid.com",
        // add more here
    }

    c := appengine.NewContext(r)
    fmt.Fprintf(w, "Sign in at: ")
    for name, url := range providers {
        login_url, err := user.LoginURLFederated(c, "/", url)
        check(err);
        fmt.Fprintf(w, "[<a href='%s'>%s</a>]", login_url, name)
    }
}

// check aborts the current execution if err is non-nil.
func check(err os.Error) {
    if err != nil {
        panic(err)
    }
}
Run Code Online (Sandbox Code Playgroud)