2011-11-03 10 views
6

Si bien tengo mucha experiencia con el tiempo de ejecución de AppEngine/Python, soy un novato en el tiempo de ejecución de Go. Mi primera aplicación está cerca de estar lista para ser implementada, pero aún necesito proporcionar una capacidad para que el usuario inicie sesión. Espero usar OpenID, ya que prefiero no requerir que el usuario tenga un ID de Google.Uso de la API de usuarios de App Engine/Go con OAuth: ejemplo de código, flujo de trabajo, ¿alguna ayuda?

Sin embargo, parece que no hay o casi no hay ejemplos de trabajo por ahí, y la documentación de App Engine omite explícitamente el contenido de la función que necesito para poner en práctica:

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

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

Lo que va dentro de la openIdHandler func ?

Entiendo que debo proporcionar una página que permita al usuario seleccionar uno de los muchos proveedores de OpenId e ingresar su Id para ese sistema. Simplemente no sé qué hacer después de eso. ¿Cuál es el flujo de trabajo? ¿Alguien sabe de algún código de muestra que pueda ver para tener una idea general de lo que debo hacer y qué datos debo manejar? Todo mi google-fu bien perfeccionado no me ha llevado a ninguna parte.

Para ser claro, no estoy buscando interactuar con ninguno de los servicios prestados por estos proveedores de OpenId; No deseo crear Tweets o Buzz. No quiero acceder a contactos, documentos, publicaciones en el muro o cualquier otra cosa. Solo quería un credencial autenticado que pueda usar dentro de mi aplicación para limitar el acceso de los usuarios solo a sus propios datos.

Respuesta

10

Si te entendí bien, necesitas , no . Reescribí el ejemplo de Python (Federated login and logout) para go-lang. Espero que esto ayude.

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