小程序登录获取微信服务器验证流程
小程序通过login方法获取到code,将code发送到服务器,服务器接收到code,加上appid和secret向微信服务器发送POST请求验证。
如果微信服务器验证通过,则开发者的服务器生成JWT令牌返回给前端,从而完成API权限的控制。
这里涉及到几个知识点:
- 如何将配置文件中的模板字符串替换成目标的字符串?
- 在服务端,如何发送POST请求?怎么解决SSL问题?
- 如何生成JWT令牌?
如何将配置文件中的模板字符串替换成目标的字符串?
引用同个配置文件中的其他配置项,可以通过${}方式来获取。
在配置文件中的模板字符串要被程序进行处理替换的字符串,可以使用{0},{1}这种方式占位,在程序中使用MessageFormat来格式化。
1 | wechat: |
在程序在使用MessageFormat来格式化占位的字符串,方法形参是可变类型参数,对应着配置文件中的{0},{1}等占位符。
1 | String url = MessageFormat.format(this.code2SessionUrl, code); |
在服务端,如何发送POST请求?怎么解决SSL问题?
我们可以利用Spring中的RestTemplate来发送POST请求,并获取返回的结果。
getForObject的第二个参数是结果返回的类型,一般为json字符串,故用String.class.
注意:可以通过new RestTemplate()来创建RestTempalte对象。在这里是使用了@Configuration将RestTemplate加入了IOC容器,并使用依赖注入的方式注入的。因为需要@Configration类解决SSL验证的问题。
1 | String resultJson = restTemplate.getForObject(url, String.class); |
使用RestTemplate解决SSL验证问题:
- 首先导入工具类SSL
- 创建@Configuration配置类,将处理过的RestTemplate加入到IOC容器中
SSL.java:
1 | /** |
@Configuration配置类:
1 |
|
如何生成JWT令牌?
我们使用auth0的jwt库,来生成JWT令牌。
首先,导入Maven依赖:
1 | <dependency> |
实现JWT令牌的生成:
withClaim方法主要是自定义信息,
withIssuedAt方法是令牌的生成时间Date,
withExpiresAt方法是令牌的过期时间Date,
sign方法最终生成一个JWT令牌字符串
1 | private static Optional<String> getToken(Long userId, int scopeLevel) { |
JWT令牌的验证:
1 | /** |