说明:自己用的,你复制过去并不能正常使用,仅作为思路,还需继续完善。
gin-vue-admin端
1.路由处router/user_token.go
package router
import (
"gin-vue-admin/api/v1"
"github.com/gin-gonic/gin"
)
func InitUserToken(Router *gin.RouterGroup) {
UserToken := Router.Group("UserToken")
{
UserToken.POST("token", v1.GetUserToken)
UserToken.POST("verify", v1.VerifyToken)
}
}
1.api处 api/v1/user_token.go
package v1
import (
"fmt"
"gin-vue-admin/global/response"
"gin-vue-admin/model"
"gin-vue-admin/service"
"github.com/gin-gonic/gin"
"github.com/medivhzhan/weapp/v2"
"gin-vue-admin/middleware"
"strconv"
"go.uber.org/zap"
"gin-vue-admin/global"
"time"
)
func GetUserToken(c *gin.Context) {
userWxCode := c.PostForm("code")
errsql,wxMiniProResult:=service.GetWxMiniProFirst()
if errsql !=nil{
response.FailWithMessage(fmt.Sprintf("小程序信息查询失败,%v", errsql), c)
}
resWX, err := weapp.Login(wxMiniProResult.WxMiniProAppid, wxMiniProResult.WxMiniProSecret, userWxCode)
if err != nil {
fmt.Printf("处理一般错误信息: %#v\n", err)
return
}
if err := resWX.GetResponseError(); err !=nil {
fmt.Printf("处理微信返回错误信息: %#v\n", err)
return
}
checkErr,checkUserReturn:= service.GetSysUserById(resWX.OpenID)
if checkErr !=nil{
var commomUserPwd="bunanedu.cn"
var sysUser model.SysUser
sysUser = model.SysUser{
Username:resWX.OpenID, NickName: "微信用户", Password: commomUserPwd, HeaderImg: "", AuthorityId: "888",
WxUser:model.WxUser{
WxUserOpenid:resWX.OpenID,
WxUserSessionkey:resWX.SessionKey,
WxUserUnionid:resWX.UnionID}}
errRegister, userReturn := service.Register(sysUser)
if errRegister !=nil{
response.FailWithMessage(fmt.Sprintf("创建系统用户失败,%v", errRegister), c)
}else{
loginAndTokenNext(c,userReturn)
}
}else{
loginAndTokenNext(c,checkUserReturn)
}
}
func loginAndTokenNext(c *gin.Context,userReturn model.SysUser){
var commomUserPwd="bunanedu.cn"
U := &model.SysUser{Username: userReturn.Username, Password: commomUserPwd}
if err, user := service.Login(U); err != nil {
response.FailWithMessage(fmt.Sprintf("用户名密码错误或%v", err), c)
} else {
tokenNext(c, *user)
}
}
func VerifyToken(c *gin.Context) {
token := c.Request.Header.Get("x-token")
j := middleware.NewJWT()
claims, err := j.ParseToken(token)
if err != nil {
if err == middleware.TokenExpired {
response.Result(response.ERROR, gin.H{
"reload": true,
}, "授权已过期", c)
c.Abort()
return
}
response.Result(response.ERROR, gin.H{
"reload": true,
}, err.Error(), c)
c.Abort()
return
}
if claims.ExpiresAt - time.Now().Unix()<claims.BufferTime {
claims.ExpiresAt = time.Now().Unix() + 60*60*24*7
newToken,_ := j.CreateToken(*claims)
newClaims,_ := j.ParseToken(newToken)
c.Header("new-token",newToken)
c.Header("new-expires-at",strconv.FormatInt(newClaims.ExpiresAt,10))
if global.GVA_CONFIG.System.UseMultipoint {
err,RedisJwtToken := service.GetRedisJWT(newClaims.Username)
if err!=nil {
global.GVA_LOG.Error("get redis jwt failed", zap.Any("err", err))
}else{
service.JsonInBlacklist(model.JwtBlacklist{Jwt: RedisJwtToken})
}
_ = service.SetRedisJWT(newToken,newClaims.Username)
}
}
c.Set("claims", claims)
c.Next()
}
小程序端
1.http/http.api.js
let getUserTokenUrl = '/UserToken/token';
let verifyTokenUrl = '/UserToken/verify/';
const install = (Vue, vm) => {
let getUserToken = (params = {}) => vm.$u.post(getUserTokenUrl, params);
let verifyToken = (params = {}) => vm.$u.post(verifyTokenUrl, params);
vm.$u.api = {
getUserToken,
verifyToken,
};
}
export default {
install
}
2.http/http.token.js
import Vue from 'vue'
const has_token = data => {
try {
const lifeData = uni.getStorageSync('lifeData');
if (lifeData.vuex_token) {
return true
} else {
return false
}
} catch (e) {
return false
}
}
const login = login => {
return new Promise(function(resolve, reject) {
uni.login({
provider: 'weixin',
success(res) {
resolve(res)
},
fail(err) {
reject(err)
}
})
})
}
const get_token = async data => {
var token = null;
var code_res = null;
await login().then(res => {
code_res = res.code
})
Vue.prototype.$u.api.getUserToken({
"code": code_res
}).then(res => {
Vue.prototype.$u.vuex('vuex_token',
res.data.data.token);
Vue.prototype.$u.vuex('vuex_user',
res.data.data.user);
}).catch(err => {
});
}
const check_token = async data => {
const lifeData = uni.getStorageSync('lifeData');
let access_token = lifeData.vuex_token || '';
let state;
await Vue.prototype.$u.api.verifyToken({
'token': access_token
}).then((res) => {
if (res.data.msg=='授权已过期' || res.data.msg=='Token not active yet') {
state = false;
} else {
state = true;
}
})
return state
}
const refresh_token = async data => {
const lifeData = uni.getStorageSync('lifeData');
let temp_token = lifeData.vuex_token || '';
let re_token = null;
let token = null;
if (temp_token == '') {
await get_token().then(res => {
Vue.prototype.$u.vuex('vuex_token',
res.data.data.token);
token = res;
})
} else {
await Vue.prototype.$u.api.refreshToken({
'old_token': temp_token
}).then((res) => {
console.log(res)
if (res.data.msg=='更新失败token is not valid yet') {
console.log(res.data.msg)
} else{
try {
Vue.prototype.$u.vuex('vuex_token',
res.data.data.token);
} catch (e) {
console.log(e)
}
}
})
if (re_token == true) {
await get_token().then(res => {
Vue.prototype.$u.vuex('vuex_token',
res.data.data.token);
token = res;
})
} else if (re_token == false) {
console.log('出错')
}
}
}
module.exports = {
has_token: has_token,
get_token: get_token,
check_token: check_token,
refresh_token: refresh_token,
}
App.vue中部分使用
import token from 'common/http/http.token.js'
autoLogin() {
if (!token.has_token()) {
token.get_token().then(
res => {
})
} else {
token.check_token().then(res => {
if (res) {
} else {
token.get_token().then(
res => {
})
}
})
}
},