程序目录结构

简单实现,用户登录后返回一个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#类的说明那种)

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

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

    本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...

  2. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  3. JWT验证

    理解 JSON Web Token(JWT) 验证 JSON Web Token认证的操作指南 在本文中,我们将了解JSON Web Token的全部内容. 我们将从JWT的基本概念开始,然后查看其结 ...

  4. Web验证方式(4)--JWT

    OAuth协议中说到的AccessToken可以是以下两种: 1.任意只起到标识作用的字符串:这种情况下Resource Server处理请求时需要去找Authorization Server获取用户 ...

  5. 手写jwt验证,实现java和node无缝切换

    前言 前端时间和我朋友写了一个简易用户管理后台,功能其实很简单,涉及到的技术栈有:vue+elementUI,java+spring MVC以及node+egg,数据库用的mysql,简单方便. 一开 ...

  6. JWT验证机制【刘新宇】【Django REST framework中使用JWT】

    JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...

  7. JWT验证机制【Python版Flask或自己写的后端可以用】【刘新宇】

    JWT Json Web Token(JWT) JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息. 官方定义:JSON Web T ...

  8. Nginx实现JWT验证-基于OpenResty实现

    介绍 权限认证是接口开发中不可避免的问题,权限认证包括两个方面 接口需要知道调用的用户是谁 接口需要知道该用户是否有权限调用 第1个问题偏向于架构,第2个问题更偏向于业务,因此考虑在架构层解决第1个问 ...

  9. 踩坑之路---JWT验证

    使用JWT验证客户的携带的token 客户端在请求接口时,需要在request的head中携带一个token令牌 服务器拿到这个token解析获取用户资源,这里的资源是非重要的用户信息 目前我的理解, ...

随机推荐

  1. c++11 多线程依次打印ABC

    并发 练习代码 #include <thread> #include <vector> #include <mutex> #include <iostream ...

  2. mysql 压缩版安装

    环境介绍:win2008_x64+mysql5.7.10  64位 1.将压缩包解压到d:\\mysql目录,并将mysql目录中的my-default.ini 重命名为my.ini 2.将my.in ...

  3. socket的同步异步的性能差别,以及listen的参数backlog

    先说listen的参数backlog,同步系统中分别设置为5,512,1024的跑分情况 跑分工具apache的ab,参数为:ab -n50000 -c300 backlog=5跑分结果 Reques ...

  4. web.xml 详细介绍(zz)

    web.xml 详细介绍 博客分类: CoreJava WebXMLServletJSPTomcat  http://mianhuaman.iteye.com/blog/1105522 1.启动一个W ...

  5. 关于 Web Api 2 认证与授权

    认证与授权 认证与授权,Authentication and Authorize,这个是两个不同的事.认证是对访问身份进行确认,如验证用户名和密码,而授权是在认证之后,判断是否具有权限进行某操作,如 ...

  6. MyEclipse Server view报错解决方法

    MyEclipse Server view报错解决方法 方法/步骤     启动MyEclipse,弹出一个框,报错. ---------------------------------------- ...

  7. CSS-背景-渐变-文本格式化

    1.背景 1.背景色 属性:background-color 取值:合法的颜色值 注意:背景颜色和背景图片默认都从边框位置处开始填充 2.背景图片 属性:background-image 取值:url ...

  8. python早期看书笔记

  9. 枚举子窗口EnumChildWindows()的应用

    1.EnumChildWindows()函数的作用枚举子窗口(按顺序调用回调函数,并将子窗口的句柄传递给了回调函数).函数原型: BOOL WINAPI EnumChildWindows( HWND ...

  10. CString成员函数详解[转]

    1.构造函数(常用) CString( const unsigned char* psz );      例:char s[]="abcdef";              cha ...