日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
構(gòu)建一個(gè)即時(shí)消息應(yīng)用(六):僅用于開發(fā)的登錄

本文是該系列的第六篇。

  • 第一篇: 模式
  • 第二篇: OAuth
  • 第三篇: 對(duì)話
  • 第四篇: 消息
  • 第五篇: 實(shí)時(shí)消息

我們已經(jīng)實(shí)現(xiàn)了通過 GitHub 登錄,但是如果想把玩一下這個(gè) app,我們需要幾個(gè)用戶來測試它。在這篇文章中,我們將添加一個(gè)為任何用戶提供登錄的端點(diǎn),只需提供用戶名即可。該端點(diǎn)僅用于開發(fā)。

首先在 main() 函數(shù)中添加此路由。

 
 
 
  1. router.HandleFunc("POST", "/api/login", requireJSON(login)) 

登錄

此函數(shù)處理對(duì) /api/login 的 POST 請(qǐng)求,其中 JSON body 只包含用戶名,并以 JSON 格式返回通過認(rèn)證的用戶、令牌和過期日期。

 
 
 
  1. func login(w http.ResponseWriter, r *http.Request) { 
  2.     if origin.Hostname() != "localhost" { 
  3.         http.NotFound(w, r) 
  4.         return 
  5.     } 
  6.  
  7.     var input struct { 
  8.         Username string `json:"username"` 
  9.     } 
  10.     if err := json.NewDecoder(r.Body).Decode(&input); err != nil { 
  11.         http.Error(w, err.Error(), http.StatusBadRequest) 
  12.         return 
  13.     } 
  14.     defer r.Body.Close() 
  15.  
  16.     var user User 
  17.     if err := db.QueryRowContext(r.Context(), ` 
  18.         SELECT id, avatar_url 
  19.         FROM users 
  20.         WHERE username = $1 
  21.     `, input.Username).Scan( 
  22.         &user.ID, 
  23.         &user.AvatarURL, 
  24.     ); err == sql.ErrNoRows { 
  25.         http.Error(w, "User not found", http.StatusNotFound) 
  26.         return 
  27.     } else if err != nil { 
  28.         respondError(w, fmt.Errorf("could not query user: %v", err)) 
  29.         return 
  30.     } 
  31.  
  32.     user.Username = input.Username 
  33.  
  34.     exp := time.Now().Add(jwtLifetime) 
  35.     token, err := issueToken(user.ID, exp) 
  36.     if err != nil { 
  37.         respondError(w, fmt.Errorf("could not create token: %v", err)) 
  38.         return 
  39.     } 
  40.  
  41.     respond(w, map[string]interface{}{ 
  42.         "authUser":  user, 
  43.         "token":     token, 
  44.         "expiresAt": exp, 
  45.     }, http.StatusOK) 

首先,它檢查我們是否在本地主機(jī)上,或者響應(yīng)為 404 Not Found。它解碼主體跳過驗(yàn)證,因?yàn)檫@只是為了開發(fā)。然后在數(shù)據(jù)庫中查詢給定用戶名的用戶,如果沒有,則返回 404 NOT Found。然后,它使用用戶 ID 作為主題發(fā)布一個(gè)新的 JSON Web 令牌。

 
 
 
  1. func issueToken(subject string, exp time.Time) (string, error) { 
  2.     token, err := jwtSigner.Encode(jwt.Claims{ 
  3.         Subject:    subject, 
  4.         Expiration: json.Number(strconv.FormatInt(exp.Unix(), 10)), 
  5.     }) 
  6.     if err != nil { 
  7.         return "", err 
  8.     } 
  9.     return string(token), nil 

該函數(shù)執(zhí)行的操作與 前文 相同。我只是將其移過來以重用代碼。

創(chuàng)建令牌后,它將使用用戶、令牌和到期日期進(jìn)行響應(yīng)。

種子用戶

現(xiàn)在,你可以將要操作的用戶添加到數(shù)據(jù)庫中。

 
 
 
  1. INSERT INTO users (id, username) VALUES 
  2.     (1, 'john'), 
  3.     (2, 'jane'); 

你可以將其保存到文件中,并通過管道將其傳送到 Cockroach CLI。

 
 
 
  1. cat seed_users.sql | cockroach sql --insecure -d messenger 

就是這樣。一旦將代碼部署到生產(chǎn)環(huán)境并使用自己的域后,該登錄功能將不可用。

本文也結(jié)束了所有的后端開發(fā)部分。

  • 源代碼

當(dāng)前文章:構(gòu)建一個(gè)即時(shí)消息應(yīng)用(六):僅用于開發(fā)的登錄
路徑分享:http://www.5511xx.com/article/cdgssgo.html