package main
import (
"crypto/sha1"
"fmt"
"net/http"
)
var db = map[string]map[string]string{}
func indexHandler(w http.ResponseWriter, r *http.Request) {
usage := `
注册用户:
curl --location --request POST '127.0.0.1:8000/register' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=admin' \
--data-urlencode 'password=admin123'
用户登录:
curl --location --request POST '127.0.0.1:8000/login' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=admin' \
--data-urlencode 'password=admin123'
`
fmt.Fprintf(w, usage)
}
func hashPasswd(passwd, salt string) string {
sha := sha1.New()
sha.Write([]byte(passwd))
sha.Write([]byte(salt))
return string(sha.Sum(nil))
}
func checkPW(username, passwd, passwdMac string) bool {
if passwdMac == hashPasswd(passwd, username) {
return true
}
return false
}
func saveUser(username string, passMac string) {
u := map[string]string{}
u["username"] = username
u["pass_mac"] = passMac
db[username] = u
}
func loginHanler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprint(w, http.StatusText(http.StatusBadRequest))
return
}
username := r.PostFormValue("username")
passwd := r.PostFormValue("password")
if username == "" ||
passwd == "" {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprint(w, "参数错误")
return
}
user, ok := db[username]
if !ok {
fmt.Fprint(w, "用户不存在")
return
}
if checkPW(username, passwd, user["pass_mac"]) {
fmt.Fprint(w, "login success")
return
}
fmt.Fprint(w, "login fail")
}
func registerHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprint(w, http.StatusText(http.StatusBadRequest))
return
}
username := r.PostFormValue("username")
passwd := r.PostFormValue("password")
if username == "" ||
passwd == "" {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprint(w, "参数错误")
return
}
passMac := hashPasswd(passwd, username)
saveUser(username, passMac)
fmt.Fprint(w, "ok")
}
func main() {
http.HandleFunc("/", indexHandler)
http.HandleFunc("/register", registerHandler)
http.HandleFunc("/login", loginHanler)
http.ListenAndServe(":8000", nil)
}
评论