程序目录结构

简单实现,用户登录后返回一个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. Spring Boot学习笔记:kafka应用

    Kafka作为众多Java消息中间件之一,有诸多优点.本文讲解Kafka的应用.学习一个新的知识点,建议先找一个demo,越简单越好的demo,跑通这个demo,了解大致原理,然后在分析细节,详细了解 ...

  2. SPOJ - NSUBSTR(长度为1-len的字串出现的最大次数

    题意:给你一个字符串,要你输出1-len的字串出现的最大次数. /** @xigua */ #include <stdio.h> #include <cmath> #inclu ...

  3. hdu--6178(多校

    题意:要在一棵 n 个点的树上放 k 只猴子,然后删掉尽量多的边,使得删边后,每只猴子都至少和另外一只猴子相连,问最后剩下的边数. 思路:其实dfs遍历一次看有多少个点-边-点就好了,比赛的时候就觉得 ...

  4. How to turn on syntax highlighting in osx

    put follow code in ~/.vimrc set ai " auto indenting set history=100 " keep 100 lines of hi ...

  5. centos7 sqoop 1 搭建笔记

    1.require : java环境,hadoop,hive ,mysql2.下载解压sqoop13.设置环境变量 export SQOOP_HOME=/data/spark/bin/sqoop ex ...

  6. 2019.02.06 bzoj2987: Earthquake(类欧几里得)

    传送门 题意简述:求满足ax+by+c≤0ax+by+c\le0ax+by+c≤0的二元组(x,y)(x,y)(x,y)对数. 思路: 类欧几里得算法模板题. 把式子变化一下变成:求满足0≤y≤−ax ...

  7. 证明LDU分解的唯一性

    首先上(下)三角矩阵乘以上(下)三角矩阵结果还是上(下)三角矩阵, 另外我们考虑相乘后的对角元素可发现,对角原始是原来2矩阵对应对角元素的乘积. 另外对角线都是1的上(下)三角矩阵必定可以只是用行运算 ...

  8. 谈谈thinkphp5.1中容器(Container)和门面(Facade)的实现

    tp5.1中引入了容器(Container)和门面(Facade)这两个新的类 官方文档已经给出了定义: 容器(Container)实现类的统一管理,确保对象实例的唯一性. 门面(Facade)为容器 ...

  9. 安装docker跨主机网络flannel

    一.实验环境 机器 操作系统 安装服务 172.16.4.36 centos7 docker etcd flannel 172.16.4.37 centos7 docker etcd flanne ( ...

  10. IntelliJ IDEA 2017版 spring-boot 2.03后 Pageable用法;Pageable用法,PageRequest过时,新用法;Pageable过时问题;

    1.旧版本Pageable用法: 但是会显示,这个版本已经过时,这时可以查看源码. 一般,一个方法过时,就会在其附近形成一个新的同名的但是其他用法的方法.按照这个理念,来找这个源码.很幸运,蒙对了,我 ...