當前位置:
首頁 > 知識 > 構建一個即時消息應用(六):僅用於開發的登錄

構建一個即時消息應用(六):僅用於開發的登錄

導讀:在這篇文章中,我們將添加一個為任何用戶提供登錄的端點,只需提供用戶名即可。該端點僅用於開發。   

本文字數: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中國榮譽推出

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!


請您繼續閱讀更多來自 Linux中國 的精彩文章:

用 testdisk 恢復 Linux 上已刪除的文件
使用 qemu-kvm 安裝和運行 Vagrant