微信小程序登录 + redis + 基于token的身份验证

官方时序图如下:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

图里其实说的很清楚了,清理下流程:

1.前端调用wx.login()获取code值

2.前端通过调用wx.getUserInfo获取iv、rawData、signature、encryptedData等加密数据,传递给后端

3.服务器通过code请求api换回session_key和openid

4.服务器通过前端给的rawData 加获取的session_key使用sha1加密,计算出signature1

5.比对前端传的signature和自己算出来的signature1是否一致(防止数据不一致)

6.用AES算法解密encryptedData里的敏感数据

7.拿着敏感数据后做自己的逻辑

8.通知前端登陆成功

 

** 这里只是想拿到用户的openid,则直接1,3就可以做到了。如下:
 

第一步:

通过wx.login(微信前端--小程序)接口获取code,将code传到后台

注意:

code的来源:是用户打开小程序的时候,随机生成的,是腾讯生成的,每个code只能使用一次,因此,理论上这个code是安全的

package cn.wmyskxz.springboot.model.user;

/**
 * @Author: Yangke
 * @Date: 2019/3/31 15:52
 **/
public class WeChatLoginModel {
    String code;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

第二步:

后台通过code访问微信(腾讯)接口,微信(腾讯)接口返回当前登录的信息:session_key及openid

返回的openid是每个用户唯一的,通过这个 可以匹配 微信(腾讯)的用户 跟 我们的用户,就是我们后台通过openid来判断这个人是谁,

UserController.java           微信小程序登录

/**
     * 微信小程序登录
     *
     * 登录成功后,将用户身份信息及session_key存入token
     * @param model
     * @return
     */
    @ResponseBody
    @PostMapping("/weChatLogin")
    public SingleResult<String> weChatLogin(@RequestBody WeChatLoginModel model){

        /**
         * 登录日志:
         * id\ userid\ date\ wx_code\ createTime
         * create table loginLog (
                id varchar(50) primary key,
                userId varchar(50),
                logindate date,
                wxcode varchar(100),
                createtime datetime
           );
         */

        SingleResult<String> result = new SingleResult<String>();
        //第三步:调用service.weChatLogin(model):后台检查openid是否存在,返回openid对应的用户
        WeChatLoginResult<UserAccount> loginResult = service.weChatLogin(model);
        
        //第四步:
        UserAccount user = loginResult.getUser();
        if(user == null ){
            result.setCode(0);
            result.setMessage("登录失败");
        }
        else {
            User u = new User();
            u.setId(user.getId());
            u.setPassword(user.getPassword() == null ? user.getWxopenid() : user.getPassword());
            u.setSessionKey(loginResult.getSession_key());
            String token = getToken(u);
            result.setToken(token);
            result.setCode(1);
            result.setMessage("登陆成功");
        }

        return result;
    }

其中:就是下面的第三步

//调用service.weChatLogin(model)
WeChatLoginResult<UserAccount> loginResult = service.weChatLogin(model);

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值