構建一個即時消息應用(六):僅用於開發的登錄
導讀:在這篇文章中,我們將添加一個為任何用戶提供登錄的端點,只需提供用戶名即可。該端點僅用於開發。
本文字數:2605,閱讀時長大約:3分鐘
https://linux.cn/article-12692-1.html
作者:Nicolás Parada
譯者:XianLei Gao
本文是該系列的第六篇。
?第四篇: 消息
?第五篇: 實時消息
我們已經實現了通過 GitHub 登錄,但是如果想把玩一下這個 app,我們需要幾個用戶來測試它。在這篇文章中,我們將添加一個為任何用戶提供登錄的端點,只需提供用戶名即可。該端點僅用於開發。
首先在??函數中添加此路由。
router.HandleFunc("POST","/api/login",requireJSON(login))
登錄
此函數處理對??的 POST 請求,其中 JSON body 只包含用戶名,並以 JSON 格式返回通過認證的用戶、令牌和過期日期。
funclogin(w http.ResponseWriter,r*http.Request){
iforigin.Hostname()!="localhost"{
http.NotFound(w,r)
return
}
varinputstruct{
Usernamestring`json:"username"`
}
iferr:=json.NewDecoder(r.Body).Decode(input);err!=nil{
http.Error(w,err.Error(),http.StatusBadRequest)
return
}
deferr.Body.Close()
varuser User
iferr:=db.QueryRowContext(r.Context(),`
SELECT id, avatar_url
FROM users
WHERE username = $1
`,input.Username).Scan(
user.ID,
user.AvatarURL,
);err==sql.ErrNoRows{
http.Error(w,"User not found",http.StatusNotFound)
return
}elseiferr!=nil{
respondError(w,fmt.Errorf("could not query user: %v",err))
return
}
user.Username=input.Username
exp:=time.Now().Add(jwtLifetime)
token,err:=issueToken(user.ID,exp)
iferr!=nil{
respondError(w,fmt.Errorf("could not create token: %v",err))
return
}
respond(w,map[string]interface{}{
"authUser":user,
"token":token,
"expiresAt":exp,
},http.StatusOK)
}
首先,它檢查我們是否在本地主機上,或者響應為?。它解碼主體跳過驗證,因為這只是為了開發。然後在資料庫中查詢給定用戶名的用戶,如果沒有,則返回?。然後,它使用用戶 ID 作為主題發布一個新的 JSON Web 令牌。
funcissueToken(subjectstring,exp time.Time)(string,error){
token,err:=jwtSigner.Encode(jwt.Claims{
Subject:subject,
Expiration:json.Number(strconv.FormatInt(exp.Unix(),10)),
})
iferr!=nil{
return"",err
}
returnstring(token),nil
}
該函數執行的操作與前文相同。我只是將其移過來以重用代碼。
創建令牌後,它將使用用戶、令牌和到期日期進行響應。
種子用戶
現在,你可以將要操作的用戶添加到資料庫中。
INSERTINTOusers(id,username)VALUES
(1,"john"),
(2,"jane");
你可以將其保存到文件中,並通過管道將其傳送到 Cockroach CLI。
catseed_users.sql|cockroach sql --insecure -d messenger
就是這樣。一旦將代碼部署到生產環境並使用自己的域後,該登錄功能將不可用。
本文也結束了所有的後端開發部分。
?源代碼
via:https://nicolasparada.netlify.com/posts/go-messenger-dev-login/
作者:Nicolás Parada選題:lujun9972譯者:gxlct008校對:wxy
本文由LCTT原創編譯,Linux中國榮譽推出