博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言web开发:3登录login
阅读量:4090 次
发布时间:2019-05-25

本文共 3589 字,大约阅读时间需要 11 分钟。

index.html

  
hello测试

main.go

package mainimport (	"bytes"	"html/template"	"log"	"time"	"github.com/valyala/fasthttp"	"gitee.com/tbq_go_packages/utils"	"github.com/savsgio/atreugo"	"github.com/dgrijalva/jwt-go"	"github.com/savsgio/go-logger")var jwtSignKey = []byte("TestForFasthttpWithJWT")type userCredential struct {	Username []byte `json:"username"`	Password []byte `json:"password"`	jwt.StandardClaims}func generateToken(username []byte, password []byte) (string, time.Time) {	logger.Debugf("Create new token for user %s", username)	expireAt := time.Now().Add(1 * time.Minute)	// Embed User information to `token`	newToken := jwt.NewWithClaims(jwt.SigningMethodHS512, &userCredential{		Username: username,		Password: password,		StandardClaims: jwt.StandardClaims{			ExpiresAt: expireAt.Unix(),		},	})	// token -> string. Only server knows the secret.	tokenString, err := newToken.SignedString(jwtSignKey)	if err != nil {		logger.Error(err)	}	return tokenString, expireAt}func validateToken(requestToken string) (*jwt.Token, *userCredential, error) {	logger.Debug("Validating token...")	user := &userCredential{}	token, err := jwt.ParseWithClaims(requestToken, user, func(token *jwt.Token) (interface{}, error) {		return jwtSignKey, nil	})	return token, user, err}type Data struct {	Username string}func main() {	config := atreugo.Config{		Addr: "0.0.0.0:8000",	}	server := atreugo.New(config)	server.GET("/", func(ctx *atreugo.RequestCtx) error {		t, err := template.ParseFiles("./template/index.html")		if err != nil {			log.Fatal("Parse file template error:", err)		}		data := Data{Username: string(ctx.FormValue("username"))}		buf := new(bytes.Buffer)		err = t.Execute(buf, data)		if err != nil {			log.Fatal("Execute file template error:", err)		}		return ctx.HTTPResponse(buf.String())	})	server.POST("/do-login", func(ctx *atreugo.RequestCtx) error {		jwtCookie := ctx.Request.Header.Cookie("atreugo_jwt")		if len(jwtCookie) == 0 {			username := string(ctx.FormValue("username"))			password := string(ctx.FormValue("password"))			db := utils.GetDb("mysql", "work:111111@tcp(192.168.56.1:3306)/hyperf_usercenter?charset=utf8")			sql := "select `password`,id from users where account=?"			row := db.SelectOne(sql, username)			var passwordDB string			var id int64			row.Scan(&passwordDB, &id)			var msg string			var status int			if passwordDB == password {				jwtCookie := ctx.Request.Header.Cookie("atreugo_jwt")				if len(jwtCookie) == 0 {					qUser := []byte("username")					qPasswd := []byte("password")					tokenString, expireAt := generateToken(qUser, qPasswd)					// Set cookie for domain					cookie := fasthttp.AcquireCookie()					defer fasthttp.ReleaseCookie(cookie)					cookie.SetKey("atreugo_jwt")					cookie.SetValue(tokenString)					cookie.SetExpire(expireAt)					ctx.Response.Header.SetCookie(cookie)				}				cookie := new(fasthttp.Cookie)				cookie.SetKey("userid")				cookie.SetValue(string(id))				ctx.Response.Header.SetCookie(cookie)				msg = "登录成功"				status = 200			} else {				status = 500				msg = "登录失败"			}			return ctx.HTTPResponse(msg, status)		} else {			return ctx.RedirectResponse("/", ctx.Response.StatusCode())		}	})	if err := server.ListenAndServe(); err != nil {		panic(err)	}}

mysql表

CREATE TABLE `users` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `account` varchar(100) NOT NULL,  `password` varchar(200) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

插入数据

INSERT INTO `hyperf_usercenter`.`users` (`account`, `password`) VALUES ('user1', '123')

 

转载地址:http://vpjii.baihongyu.com/

你可能感兴趣的文章
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>
删除docker容器和镜像的命令
查看>>
gazebo似乎就是在装ROS的时候一起装了,装ROS的时候选择的是ros-melodic-desktop-full的话。
查看>>
React + TypeScript 实现泛型组件
查看>>
TypeScript 完全手册
查看>>
React Native之原理浅析
查看>>
Git操作清单
查看>>
基础算法
查看>>
前端面试
查看>>
JavaScript实现DOM树的深度优先遍历和广度优先遍历
查看>>
webpack4 中的 React 全家桶配置指南,实战!
查看>>
react 设置代理(proxy) 实现跨域请求
查看>>
通过试题理解JavaScript
查看>>
webpack的面试题总结
查看>>
实践这一次,彻底搞懂浏览器缓存机制
查看>>
Koa2教程(常用中间件篇)
查看>>
React Hooks 完全指南
查看>>
nvm 和 nrm 的安装与使用
查看>>
React Redux常见问题总结
查看>>