自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

構(gòu)建一個(gè)即時(shí)消息應(yīng)用(六):僅用于開發(fā)的登錄

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

[[345429]]

本文是該系列的第六篇。

我們已經(jīng)實(shí)現(xiàn)了通過(guò) GitHub 登錄,但是如果想把玩一下這個(gè) app,我們需要幾個(gè)用戶來(lái)測(cè)試它。在這篇文章中,我們將添加一個(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 格式返回通過(guò)認(rèn)證的用戶、令牌和過(guò)期日期。

  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。它解碼主體跳過(guò)驗(yàn)證,因?yàn)檫@只是為了開發(fā)。然后在數(shù)據(jù)庫(kù)中查詢給定用戶名的用戶,如果沒(méi)有,則返回 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í)行的操作與 前文 相同。我只是將其移過(guò)來(lái)以重用代碼。

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

種子用戶

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

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

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

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

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

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

 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2020-10-09 12:45:19

創(chuàng)建消息即時(shí)消息編程語(yǔ)言

2019-09-29 15:25:13

CockroachDBGoJavaScript

2020-10-09 15:00:56

實(shí)時(shí)消息編程語(yǔ)言

2019-10-28 20:12:40

OAuthGuard中間件編程語(yǔ)言

2020-03-31 12:21:20

JSON即時(shí)消息編程語(yǔ)言

2020-10-12 09:20:13

即時(shí)消息Access頁(yè)面編程語(yǔ)言

2020-10-19 16:20:38

即時(shí)消息Conversatio編程語(yǔ)言

2020-10-16 14:40:20

即時(shí)消息Home頁(yè)面編程語(yǔ)言

2021-03-25 08:29:33

SpringBootWebSocket即時(shí)消息

2023-08-14 08:01:12

websocket8g用戶

2015-03-18 15:37:19

社交APP場(chǎng)景

2014-10-15 11:01:02

Web應(yīng)用測(cè)試應(yīng)用

2021-12-03 00:02:01

通訊工具即時(shí)

2023-02-16 14:38:24

Rnote開源繪圖

2009-06-29 09:06:42

微軟Web版MSN

2022-02-10 07:03:32

流量應(yīng)用架構(gòu)數(shù)據(jù)交換

2018-08-22 17:32:45

2023-09-15 10:10:05

R 語(yǔ)言

2011-12-27 09:49:50

AndroidiOSFlurry
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)