本文是系列文章的第六篇。第1部分:模式第2部分:OAuth第3部分:对话框第4部分:消息第5部分:实时消息我们已经通过GitHub实现了登录,但是如果我们想玩这个应用程序,我们需要一些用户来测试它。在这篇文章中,我们将添加一个端点,为任何用户提供登录,只需提供用户名即可。此端点仅用于开发。首先在main()函数中添加这条路由。router.HandleFunc("POST","/api/login",requireJSON(login))Login该函数处理对/api/login的POST请求,其中JSONbody只包含用户名,并以JSON格式返回认证用户、令牌和到期日期。funclogin(whttp.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()varuserUseriferr:=db.QueryRowContext(r.Context(),`SELECTid,avatar_urlFROMusersWHEREusername=$1`,input.Username).Scan(&user.ID,&user.AvatarURL,);err==sql.ErrNoRows{http.Error(w,"Usernotfound",http.StatusNotFound)return}elseiferr!=nil{respondError(w,fmt.Errorf("couldnotqueryuser:%v",err))return}user.Username=input.Usernameexp:=time.Now().Add(jwtLifetime)token,err:=issueToken(user.ID,exp)iferr!=nil{respondError(w,fmt.Errorf("couldnotcreatetoken:%v",err))return}respond(w,map[string]interface{}{"authUser":user,"token":token,"expiresAt":exp,},http.StatusOK)}首先,它检查我们是否在本机上,或者响应为404Not发现它解码主体跳过验证,因为这仅用于开发。然后在数据库中查询给定用户名的用户,如果没有则返回404NOTFound。然后,它会发布一个新的JSONWebToken,并以用户ID作为主题。funcissueToken(subjectstring,exptime.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');您可以将其保存到文件中并将其通过管道传输到CockroachCLI。catseed_users.sql|cockroachsql--insecure-dmessenger就是这样做的。一旦代码部署到生产环境并使用自己的域,登录功能将不可用。本文还总结了所有后端开发部分。源代码