83,微信token验证失败的解决方法
一、问题由来
在使用URL和Token启用微信公众平台开发模式消息接口的时候,我们会碰到下面三种情况
1 token校验失败
这样回头检查一下各项配置是否正确。如果确定配置没有问题,请按下面的方法检查
2 请求URL超时
你的服务器在国外,或者服务器网速不给力,一般多试几次就可以了。如果经常这样,就需要考虑更换服务器
3 提交成功
恭喜你,配置成功了。
我们来讲解一下第一种的原因及解决方法。
这里用的是飞鸽内网穿透 https://neiwangchuantouvip/help/
token和session都可以用来做身份验证,而session用多了,对服务器的压力是很大的。
这里主要是生成一个uuid作为账户的身份令牌,用来校验用户是否登录。
项目里有用MyBatis-Plus,先简单说下MyBatis-Plus的配置,如果是用Mybatis之类的可以直接跳过这些配置
maven依赖相应的包
配置文件:
mybatis-plus配置
用户 实体类
用户Token
@Data 是lombok插件的注解,自动生成get、set、toString等
注意如果用了MyBatis-Plus创建的实体类必须加@TableName注解,否则会报错,当然你也得去建相应的表
配置一个自定以注解:@Login, 只要加了这个注解的就会校验用户的Token。
@LoginUser 用来获取用户信息,需要的话可以配置,也可以忽视的。
用户登录的时候给当前用户生成或修改token
controller
service
生成token createToken(long id),登出的时候调expireToken(long userId) 使当前用户的token失效时间设置为当前时间
当然还需要配置一个拦截器,拦截只要加了@Login注解的方法就会校验用户的token
拦截器:
@LoginUser 获取用户信息
WebMvcConfigurer
需要注意的是/ 不可以设置为/demo/ ,/demo 为context-path 否则会使拦截器失效
异常处理器
在swagger配置里添加securitySchemes 可以在swagger页面设置header
访问接口没有设置token的时候
获取token
将其复制粘贴到
把认证信息保存在客户端,关键点就是安全的验证,如果能解决认证信息的安全性问题,完全可以把认证信息保存在客户端,服务端完全无认证状态,这样的话服务端扩展起来要方便很多。关于信息的安全解决方案,现在普遍的做法就是签名机制,像微信公众接口的验证方式就基于签名机制。签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。当用户成功登系统并成功验证有效之后,服务器会利用某种机制产生一个token字符串,这个token中可以包含很多信息,例如来源IP,过期时间,用户信息等, 把这个字符串下发给客户端,客户端在之后的每次请求
中都携带着这个token,携带方式其实很自由,无论是cookie方式还是其他方式都可以,但是必须和服务端协商一致才可以。当然这里我不推荐cookie。当服务端收到请求,取出token进行验证(可以验证来源ip,过期时间等信息),如果合法则允许进行操作。基于token的验证方式也是现代互联网普通使用的认证方式,那它有什么优点
1支持跨域访问,Cookie是不允许垮访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输
2无状态:Token机制在服务端不需要存储session信息,因为Token自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息
3解耦 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可
4适用性更广:只要是支持http协议的客户端,就可以使用token认证。
5服务端只需要验证token的安全,不必再去获取登录用户信息,因为用户的登录信息已经在token信息中。
6基于标准化:你的API可以采用标准化的 JSON Web Token (JWT) 这个标准已经存在多个后端库(NET, Ruby, Java,Python,PHP)和多家公司的支持(如:Firebase,Google, Microsoft)
0条评论