2011-11-03 26 views
6

Trong khi tôi rất có kinh nghiệm với thời gian chạy AppEngine/Python, tôi là một newbie cho thời gian chạy Go. Ứng dụng đầu tiên của tôi sắp sẵn sàng để triển khai, nhưng tôi vẫn cần cung cấp khả năng cho người dùng đăng nhập. Tôi hy vọng sẽ sử dụng OpenID, vì tôi không muốn người dùng có một Id Google.Sử dụng API người dùng AppEngine/Go với OAuth: mẫu mã, quy trình làm việc, trợ giúp nào?

Tuy nhiên, có vẻ như không có hoặc hầu như không có ví dụ làm việc trên mạng, và các tài liệu AppEngine explicity bỏ qua nội dung của các chức năng mà tôi cần phải thực hiện:

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

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

gì đi bên trong openIdHandler func ?

Tôi hiểu rằng tôi cần cung cấp trang cho phép người dùng chọn một trong nhiều nhà cung cấp OpenId và nhập Id của họ cho hệ thống đó. Tôi chỉ không biết phải làm gì sau đó. Quy trình làm việc là gì? Có ai biết về bất kỳ mã mẫu nào mà tôi có thể xem xét để có được một ý tưởng chung về những gì tôi phải làm và dữ liệu nào tôi phải xử lý? Tất cả google-fu của tôi cũng đã dẫn tôi đến đâu đó.

Để rõ ràng, tôi không tìm cách tương tác với bất kỳ dịch vụ nào được cung cấp bởi các nhà cung cấp OpenId này; Tôi không muốn tạo Tweets hoặc Buzz. Tôi không muốn truy cập vào danh bạ, tài liệu, bài đăng trên Tường hoặc bất kỳ nội dung nào khác. Tôi chỉ muốn một tài chính xác thực mà tôi có thể sử dụng bên trong ứng dụng của mình để giới hạn người dùng chỉ truy cập vào dữ liệu của riêng họ.

Trả lời

10

Nếu tôi hiểu rõ bạn - bạn cần , không phải . Tôi viết lại ví dụ python (Federated login and logout) cho go-lang. Hy vọng điều này giúp đỡ.

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) 
    } 
} 
Các vấn đề liên quan