golang简单实现jwt验证(beego、xorm、jwt)

程序目录结构

简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息。

app.conf文件内容(可以用个beego直接读取里面的内容)写的是一个jwt的secretkey

jwtkey="12345678"

config.json里面保存的是连接数据库的用户名和密码(这里只是学习如何读取json的配置文件,可以集成到beego的app.conf文件里)

{
"sqltype":"mssql"
,"connstring":"server=.;port=1433;user id=sa;password=123;database=table1"
}

MSSqlHelper.go实现连接mssqlserver的数据库

package mssqlhelper

import (
	"fmt"

	"github.com/akkuman/parseConfig"
	_ "github.com/denisenkom/go-mssqldb"
	"github.com/go-xorm/core"
	"github.com/go-xorm/xorm"
)

// 创建 XORM 客户端
func CreateClient() *xorm.Engine {
	var config = parseConfig.New("config.json")
	sqltype := config.Get("sqltype")
	fmt.Println(sqltype)
	connstring := config.Get("connstring")
	fmt.Println(connstring)
	engine, err := xorm.NewEngine(sqltype.(string), connstring.(string))
	if err != nil {
		println("open error:", &err)
	}
	engine.SetMapper(core.SameMapper{})      //表示Struct的类的名称和数据库中相同
	engine.ShowSQL(true)                     //显示SQL语句
	engine.Logger().SetLevel(core.LOG_DEBUG) //打印SQL语句

	return engine
}

AuthorizeController.go实现用户登录、获取用户信息接口

package controller

import (
	"GoApi/DAL"
	"GoApi/Model"
	"encoding/json"
	"fmt"
	"net/http"
	"strconv"
	"strings"
	"time"

	"github.com/astaxie/beego/context"

	"github.com/astaxie/beego"
	jwt "github.com/dgrijalva/jwt-go"
	"github.com/go-xorm/xorm"
)

var engine *xorm.Engine

type AuthorizeController struct {
	beego.Controller
}

var filterUser = func(ctx *context.Context) {
	token := ctx.Input.Header("Authorization")

	b, _ := CheckToken(token)

	//验证Token是否合法
	if !b {
		http.Error(ctx.ResponseWriter, "Token verification not pass", http.StatusBadRequest)
		return
	}
	fmt.Println("Request token:", token)
}

func init() {
	engine = mssqlhelper.CreateClient()
    //访问接口前验证token
	beego.InsertFilter("/Authorize/Userinfo", beego.BeforeRouter, filterUser)
}

type Token struct {
	Token string `json:"token"`
}

func fatal(err error) {
	if err != nil {
		beego.Error(err)
	}
}

//登录
func (this *AuthorizeController) Login() {
	var user Model.LoginModel
    // url?username=111&password=222 这种形式
	user.UserName = this.GetString("username")
	user.PassWord = this.GetString("password")

    //err := this.ParseForm(&user) //接收application/x-www-form-urlencoded形式POST传递数据,如Username=111&Password=2222
    // err := json.NewDecoder(this.Ctx.Request.Body).Decode(&user) //接收json形式Post的数据

	loginuser := &Model.Usertable{Userloginname: user.UserName}
	has, err := engine.Get(loginuser)
	if err != nil {
		fatal(err)
	}
	if !has {
		fatal(err)
		http.Error(this.Ctx.ResponseWriter, "User Not Exist", http.StatusBadRequest)
		return
	}

	if user.PassWord != loginuser.Userloginpwd {
		this.Ctx.Output.Header("SetStatus", strconv.Itoa(http.StatusBadRequest))

		http.Error(this.Ctx.ResponseWriter, "Password Wrong", http.StatusBadRequest)
		return
	}

	claims := make(jwt.MapClaims)
	claims["exp"] = time.Now().Add(time.Hour * time.Duration(1)).Unix()
	claims["iat"] = time.Now().Unix()
	claims["nameid"] = loginuser.Userloginname
	claims["User"] = "true"
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	tokenString, err := token.SignedString([]byte(beego.AppConfig.String("jwtkey")))
	if err != nil {
		this.Ctx.Output.Header("SetStatus", strconv.Itoa(http.StatusInternalServerError))
		fatal(err)
		http.Error(this.Ctx.ResponseWriter, "Server is Wrong", http.StatusInternalServerError)
		return
	}

	fmt.Println("Token:", tokenString)
	this.Ctx.WriteString(fmt.Sprintf("{\"Token\":\"%s\"}", tokenString))
}

func (this *AuthorizeController) Userinfo() {
	token := this.Ctx.Input.Header("Authorization")

	b, t := CheckToken(token)
	if !b {
		this.Ctx.WriteString(fmt.Sprintf("Error:%s", token))
		return
	}
	loginuser := &Model.Usertable{Userloginname: claims["nameid"].(string)}
	has, err := engine.Get(loginuser)
	if err != nil {
		fatal(err)
	}
	if !has {
		fatal(err)
		http.Error(this.Ctx.ResponseWriter, "User Not Exist", http.StatusBadRequest)
		return
	}
	data, err := json.Marshal(loginuser)
	if err != nil {
		fmt.Println(err)
	}
	this.Ctx.WriteString(fmt.Sprintf("{\"Token\":\"%s\",\"User\":%s}", token, string(data)))
}

// 校验token是否有效
func CheckToken(token string) (b bool, t *jwt.Token) {
	kv := strings.Split(token, " ")
	if len(kv) != 2 || kv[0] != "Bearer" {
		beego.Error("AuthString invalid:", token)
		return false, nil
	}
	t, err := jwt.Parse(kv[1], func(*jwt.Token) (interface{}, error) {
		return []byte(beego.AppConfig.String("jwtkey")), nil
	})
	fmt.Println(t)
	if err != nil {
		fmt.Println("转换为jwt claims失败.", err)
		return false, nil
	}
	return true, t
}

LoginModel.go 提交登录用户名和密码的结构

package Model

type LoginModel struct {
	UserName string `xorm:"VARCHAR(50)"`
	PassWord string `xorm:"VARCHAR(50)"`
}

UserTable.go 用户信息实体结构

package Model

type Usertable struct {
	Userid        int    `xorm:"not null pk INT(4)"`
	Userloginname string `xorm:"VARCHAR(50)"`
	Userloginpwd  string `xorm:"VARCHAR(50)"`
	Username      string `xorm:"NVARCHAR(200)"`
	Usermobile    string `xorm:"VARCHAR(11)"`
	Userislock    int    `xorm:"BIT(1)"`
}

main.go中通过beego启动http的web服务

package main

import (
	"GoApi/controller"
	"github.com/astaxie/beego"
)

func main() {
	beego.AutoRouter(&controller.AuthorizeController{})
	beego.Run()
}

下一步

1、学习如何在拦截器里拦截验证后把某个结果值传递给要访问的接口(目前是在接口里重新解析一遍jwt的token)

2、beego如何实现只允许post访问某个controller的接口(AutoRouter模式下)

3、Struct如何实现中文的说明(就是鼠标放上去会显示中文描述,类似C#类的说明那种)

原文地址:https://www.cnblogs.com/wdw984/p/10259169.html

时间: 2024-08-28 14:56:36

golang简单实现jwt验证(beego、xorm、jwt)的相关文章

webapi中使用token验证(JWT验证)

本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get("api/token?username=cuong&password=1").then(function (res) { // 返回一个token /* token示例如下 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZ

jwt验证

什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密. Token认证和Session认证的区别 传统的session认证 我们知道

Sping Boot + Spring Security + Mybaits + Logback + JWT验证项目开发框架搭建

简介 本文介绍Sping Boot + Spring Security + Mybaits + Logback 项目开发框架搭建过程,并且实现JWT验证,代码已上传到github,地址在文章最后可以直接下载代码. 搭建过程 1 建立工程 工程目录如下: 2 上传至GitHub 使用Git shell 进入文件夹 添加远程仓库 上传到远程仓库 如果提示这个错误 Permission denied(publickey) 需要将本地ssh key添加到仓库 首先产生本地sshkey 将本地sshkey

SpringMVC 集成 JWT验证方式

JWT官网: https://jwt.io/ 这里以java的ssm框架为例,集成jwt. 1.pom.xml 导入jwt的包 <!-- jwt --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>2.2.0</version> </dependency> 2.编写jwt的工

Shiro&amp;Jwt验证

此篇基于 SpringBoot 整合 Shiro & Jwt 进行鉴权 相关代码编写及解析 首先我们创建 JwtFilter 类 继承自 BasicHttpAuthenticationFilter org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter 此类是一个过滤器,后期会通过Shiro配置进去 重写4个重要的方法 其执行顺序亦是如下 1. preHandle(..) 前置处理 2. isAccessAllowed(..

springboot之Jwt验证

简介 什么是JWT(Json Web Token) jwt是为了在网络应用环境间传递声明而执行的一种基于json的开放标准.该token被设计紧凑且安全的,特别适用于SSO场景. jwt的声明一般被用来在身份提供者和服务提供者之间传递被认证的用户身份信息. JWT长什么样 eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0MDAyIiwiZXhwIjoxNTEwOTcwMjU4fQ._FOqy5l44hODu3DjXh762LNUTLNQH15fdCUerdseDpmSK

drf框架中jwt认证,以及自定义jwt认证

0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pip install djangorestframework-jwt 使用自带设定好的jwt from django.urls import path from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path(

如何利用jQuery进行简单表单验证

如何利用jQuery进行简单表单验证:利用jQuery可以进行表单验证,当然有比较复杂的表单验证,这里就不介绍了,下面就简单介绍一下如何使用jQuery进行简单的表单验证,然后大家可以通过改造进行基本的表达验证了.先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http

Shiro处理简单的身份验证的分析及实例

在两天在看Shiro,开涛兄的教程还是写的比较易读,差不多看了一天吧,就准备拿来用了. 可能是想的太简单了,在用的时候确实碰到一些问题,就拿最简单的身份验证来说吧: 需要说明的是,这里是集成在Spring中使用,身份验证我直接使用了Shiro提供的 org.apache.shiro.web.filter.authc.FormAuthenticationFilter 如果url应用了该拦截器,那么处理流程是大致这样的: 由于之前用markdown花的流程图显示不下,所以还是改成图片形式了. 比如我