2011-11-03 9 views
6

私は非常にAppEngineの/ Pythonランタイムで経験していますが、私は囲碁ランタイムへの初心者です。私の最初のアプリケーションは、ロールアウトする準備ができているに近いですが、私はまだ。私はむしろ、ユーザーはGoogleのIDを持っていることを必要としないよう、OpenIDのを使用することを期待していますユーザーがログインするための機能を提供する必要があります。AppEngine/GoユーザーAPIをOAuthで使用する:コードサンプル、ワークフロー、あらゆるヘルプ?

しかし、何かほとんどの作業例がそこに存在していると思われていない、とAppEngineのドキュメントは、明示的に私が実装する必要がある機能の内容が省略されています。

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

func openIdHandler(w http.ResponseWriter, r *http.Request) { 
    // ... 
} 

openIdHandler FUNC内部に入る何?

私は多くのOpenIdプロバイダの1つを選択し、そのシステムのIDを入力できるページを提供する必要があることを理解します。私はちょうどその後に何をするか分からない。ワークフローとは何ですか?誰かが私が何をしなければならないか、またどのデータを処理する必要があるのか​​について一般的な考えを得るために見ることができるサンプルコードを知っていますか?私のよく磨かれたgoogle-fuは私をどこにも導かない。

、私はこれらのOpenIDプロバイダが提供するサービスのいずれかとの対話を見ているわけではない明確にします。私はツイートやバズを作成したくありません。私は連絡先、ドキュメント、ウォールの投稿、またはその他のものへのアクセスを望んでいません。私は自分のアプリケーション内で自分のデータだけにアクセスすることを制限するために使用できる認証されたクレデンシャルを欲しかった。

答えて

10

私はあなたによく理解している場合 - あなたはをする必要はありません。 go-langのpythonの例(Federated login and logout)を書きました。この助けを願っています。

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) 
    } 
}