2011-11-03 7 views
6

Chociaż jestem bardzo doświadczony w środowisku wykonawczym AppEngine/Python, jestem początkującym użytkownikiem runtime Go. Moja pierwsza aplikacja jest już prawie gotowa do wdrożenia, ale nadal potrzebuję możliwości zalogowania się użytkownika. Mam nadzieję, że skorzystam z OpenID, ponieważ wolałbym, aby użytkownik nie miał identyfikatora Google.Korzystanie z interfejsu AppEngine/Go Users API z OAuth: przykład kodu, przepływ pracy, jakaś pomoc?

Wydaje się jednak, że nie ma lub prawie nie ma przykładów pracy tam, a dokumentacja AppEngine jawnie pomija treść funkcji, które trzeba wdrożyć:

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

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

co dzieje się wewnątrz openIdHandler func ?

Rozumiem, że muszę podać stronę, która pozwoli użytkownikowi wybrać jednego z wielu dostawców OpenID i wprowadzić ich identyfikator dla tego systemu. Po prostu nie wiem, co robić dalej. Co to jest przepływ pracy? Czy ktokolwiek wie o jakimś przykładowym kodzie, na który mogę się przyjrzeć, aby uzyskać ogólne wyobrażenie o tym, co muszę zrobić i jakie dane muszę obsłużyć? Wszystkie moje dobrze wyszkolone google-fu nie doprowadziły mnie nigdzie.

Dla jasności, nie zamierzam wchodzić w interakcje z żadną z usług świadczonych przez tych dostawców OpenID; Nie chcę tworzyć tweetów ani buzzów. Nie chcę dostępu do kontaktów, dokumentów, wpisów na ścianie ani niczego innego. Po prostu chciałem uwierzytelnionego credenital, którego mogę użyć w mojej aplikacji, aby ograniczyć dostęp użytkowników tylko do własnych danych.

Odpowiedz

10

Jeśli dobrze cię zrozumiałem - potrzebujesz , a nie . Przepisałem przykład Pythona (Federated login and logout) dla polecenia go-lang. Mam nadzieję, że to pomoże.

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) 
    } 
} 
Powiązane problemy