2011-11-03 6 views
6

जबकि मैं ऐपइंजिन/पायथन रनटाइम के साथ बहुत अनुभवी हूं, मैं गो रनटाइम के लिए नौसिखिया हूं। मेरा पहला एप्लिकेशन रोल आउट करने के लिए तैयार होने के करीब है, लेकिन मुझे अभी भी उपयोगकर्ता को लॉग इन करने की क्षमता प्रदान करने की आवश्यकता है। मैं ओपनआईडी का उपयोग करने की उम्मीद कर रहा हूं, क्योंकि मुझे इसकी आवश्यकता नहीं होगी कि उपयोगकर्ता के पास Google आईडी है।ओएथ के साथ एपइंजिन/गो यूजर एपीआई का उपयोग करना: कोड नमूना, वर्कफ़्लो, कोई मदद?

हालांकि, ऐसा लगता है कि वहाँ कोई या लगभग कोई काम कर रहे उदाहरण वहाँ बाहर हैं कि, और AppEngine प्रलेखन स्पष्ट रूप से समारोह की सामग्री है कि मैं लागू करने की आवश्यकता को छोड़ देता है:

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

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

क्या openIdHandler समारोह अंदर चला जाता है ?

मैं समझता हूं कि मुझे एक पृष्ठ प्रदान करने की आवश्यकता है जो उपयोगकर्ता को कई ओपनआईडी प्रदाताओं में से एक का चयन करने और उस प्रणाली के लिए अपना आईडी दर्ज करने की अनुमति देगा। मुझे नहीं पता कि उसके बाद क्या करना है। वर्कफ़्लो क्या है? क्या किसी को किसी भी नमूना कोड के बारे में पता है जिसे मैं देख सकता हूं कि मुझे क्या करना चाहिए और मुझे कौन सा डेटा संभालना चाहिए? मेरे सभी सम्मानित Google-fu ने मुझे कहीं भी नेतृत्व नहीं किया है।

स्पष्ट होने के लिए, मैं इन ओपनआईडी प्रदाताओं द्वारा प्रदान की जाने वाली किसी भी सेवा के साथ बातचीत करने की तलाश नहीं कर रहा हूं; मैं ट्वीट्स या बज़ बनाना नहीं चाहता हूं। मैं संपर्क, दस्तावेज़, वॉल पोस्टिंग या कुछ और तक पहुंच नहीं चाहता हूं। मैं बस एक प्रमाणीकृत प्रमाण पत्र चाहता था जिसे मैं अपने आवेदन के अंदर उपयोग कर सकता हूं ताकि उपयोगकर्ताओं को केवल अपने डेटा तक पहुंच सीमित कर सकें।

उत्तर

10

यदि मैं आपको अच्छी तरह से समझता हूं - आपको की आवश्यकता है, नहीं। मैं गो-लांग के लिए पायथन उदाहरण (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) 
    } 
} 
संबंधित मुद्दे