Dalam dunia internet moden, keselamatan dan pengesahan identiti adalah penting. Perkara yang sama berlaku untuk pembangun membangunkan aplikasi menggunakan Golang. Artikel ini akan menerangkan pengesahan dalam Golang, yang merangkumi Pengesahan Asas dan Pengesahan OAuth 2.0.
Pengesahan Asas ialah salah satu kaedah pengesahan yang paling mudah dan biasa. Di Golang, kita boleh menggunakan pakej net/http
terbina dalam untuk melaksanakan pengesahan asas. Berikut ialah contoh:
package main import ( "fmt" "net/http" ) func BasicAuth(handler http.HandlerFunc, username, password string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { user, pass, ok := r.BasicAuth() if !ok || user != username || pass != password { w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`) w.WriteHeader(401) w.Write([]byte("Unauthorized.\n")) return } handler(w, r) } } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") } func main() { username := "user" password := "pass" http.HandleFunc("/", BasicAuth(handler, username, password)) http.ListenAndServe(":8080", nil) }
Dalam contoh di atas, kami telah menentukan fungsi BasicAuth
yang mengesahkan bahawa nama pengguna dan kata laluan sepadan dengan bukti kelayakan yang disediakan oleh r.BasicAuth()
. Jika tiada bukti kelayakan diberikan atau bukti kelayakan yang diberikan tidak betul, respons HTTP 401 Tanpa kebenaran akan dicetuskan. Jika bukti kelayakan berjaya disahkan, fungsi handler
dipanggil.
Selain contoh pengesahan asas ini, anda juga boleh menggunakan perpustakaan pengesahan yang disediakan oleh pakej kepunyaan pihak ketiga yang lain, seperti Gorilla Toolkit
.
OAuth2.0 ialah standard terbuka untuk proses membenarkan pihak ketiga mengakses sumber pengguna yang dibenarkan. Di Golang, kita boleh menggunakan pakej go-oauth2/oauth2
untuk melaksanakan pengesahan OAuth 2.0.
Kami perlu mendaftarkan permohonan kami terlebih dahulu di tapak web penyedia OAuth2.0 dan dapatkan ID dan kunci pelanggan. Sebagai contoh, kami boleh membuat dan mendaftarkan projek baharu dalam Google Cloud Console dan memilih "Buat Bukti Kelayakan" untuk mendapatkan ID dan rahsia pelanggan kami.
Kami perlu menyediakan konfigurasi klien untuk mengesahkan menggunakan OAuth2.0. Kita boleh mencapai ini dengan mencipta objek oauth2.Config
:
import ( "golang.org/x/oauth2" ) var ( clientID = "YOUR_CLIENT_ID" clientSecret = "YOUR_CLIENT_SECRET" redirectURL = "http://localhost:8080/callback" endpoint = google.Endpoint scopes = []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"} ) var ( oauth2Config = oauth2.Config{ ClientID: clientID, ClientSecret: clientSecret, RedirectURL: redirectURL, Endpoint: endpoint, Scopes: scopes, } )
Dalam contoh di atas, kami mentakrifkan ID pelanggan, rahsia pelanggan, URL ubah hala, titik akhir dan skop OAuth2.0. endpoint
di sini berasal daripada google.Endpoint
, iaitu infrastruktur pembekal OAuth2.0 yang dipratakrifkan.
Sekarang kami telah menyediakan konfigurasi klien, kami perlu mengubah hala pengguna ke halaman kebenaran OAuth2.0. Kita boleh menggunakan kaedah oauth2Config.AuthCodeURL
untuk mendapatkan URL kebenaran. Berikut ialah contoh:
import ( "fmt" "net/http" ) func handleAuthorize(w http.ResponseWriter, r *http.Request) { url := oauth2Config.AuthCodeURL("") http.Redirect(w, r, url, http.StatusFound) }
Dalam contoh di atas, kami menggunakan kaedah oauth2Config.AuthCodeURL("")
untuk mendapatkan URL kebenaran dan kemudian menggunakan http.Redirect
untuk mengubah hala pengguna ke halaman kebenaran.
Setelah pengguna bersetuju untuk membenarkan aplikasi kami, pembekal OAuth2.0 akan mengubah hala pengguna ke URL ubah hala yang kami sediakan. Dalam URL ubah hala, kami akan memasukkan kod kebenaran yang perlu kami gunakan untuk mendapatkan token akses.
Kami perlu menentukan pengendali panggilan balik untuk mengendalikan permintaan panggilan balik daripada pembekal OAuth2.0. Berikut ialah contoh:
func handleOAuth2Callback(w http.ResponseWriter, r *http.Request) { code := r.FormValue("code") token, err := oauth2Config.Exchange(oauth2.NoContext, code) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } client := oauth2Config.Client(oauth2.NoContext, token) resp, err := client.Get("https://www.googleapis.com/oauth2/v1/userinfo?alt=json") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer resp.Body.Close() data, err := ioutil.ReadAll(resp.Body) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } fmt.Fprintf(w, "Data: %s", data) }
Dalam contoh di atas, kami mula-mula mengekstrak kod kebenaran daripada panggilan balik dan kemudian menggunakan kaedah oauth2Config.Exchange
untuk mendapatkan token akses. Kami boleh menggunakan kaedah oauth2Config.Client
untuk mencipta klien HTTP yang disahkan dan menggunakan klien ini untuk memanggil API Google OAuth2.0.
Akhirnya kami boleh membalas permintaan dengan menulis data tindak balas dalam pembolehubah data
.
Dalam artikel ini, kami memperkenalkan dua cara untuk melaksanakan pengesahan di Golang: Pengesahan Asas dan Pengesahan OAuth 2.0. Dengan menggunakan kaedah ini, kami boleh memastikan bahawa aplikasi kami selamat dan hanya membenarkan akses kepada pengguna yang dipercayai.
Atas ialah kandungan terperinci Bagaimana untuk mengesahkan identiti dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!