• 在线教育项目-day12【完善后端整合前端】


    我们要往首页传一个token,让他取得用户信息

    并且cookie无法做到跨域

    最终解决方案:

    使用JWT生成token,传到路径后

    1.完善callback方法

    @GetMapping("callback")
    public String callback(String code, String state) {
    try {
    //1 获取code值,临时票据,类似于验证码
    //2 拿着code请求 微信固定的地址,得到两个值 accsess_token 和 openid
    String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
    "?appid=%s" +
    "&secret=%s" +
    "&code=%s" +
    "&grant_type=authorization_code";
    //拼接三个参数 :id 秘钥 和 code值
    String accessTokenUrl = String.format(
    baseAccessTokenUrl,
    ConstantPropertiesUtil.WX_OPEN_APP_ID,
    ConstantPropertiesUtil.WX_OPEN_APP_SECRET,
    code
    );
    //请求这个拼接好的地址,得到返回两个值 accsess_token 和 openid
    //使用httpclient发送请求,得到返回结果
    String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);

    //从accessTokenInfo字符串获取出来两个值 accsess_token 和 openid
    //把accessTokenInfo字符串转换map集合,根据map里面key获取对应值
    //使用json转换工具 Gson
    Gson gson = new Gson();
    HashMap mapAccessToken = gson.fromJson(accessTokenInfo, HashMap.class);
    String access_token = (String)mapAccessToken.get("access_token");
    String openid = (String)mapAccessToken.get("openid");

    //把扫描人信息添加数据库里面
    //判断数据表里面是否存在相同微信信息,根据openid判断
    UcenterMember member = memberService.getByOpenid(openid);
    if(member == null) {//memeber是空,表没有相同微信数据,进行添加

    //3 拿着得到accsess_token 和 openid,再去请求微信提供固定的地址,获取到扫描人信息
    //访问微信的资源服务器,获取用户信息
    String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
    "?access_token=%s" +
    "&openid=%s";
    //拼接两个参数
    String userInfoUrl = String.format(
    baseUserInfoUrl,
    access_token,
    openid
    );
    //发送请求
    String userInfo = HttpClientUtils.get(userInfoUrl);
    //获取返回userinfo字符串扫描人信息
    HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);
    String nickname = (String)userInfoMap.get("nickname");//昵称
    String headimgurl = (String)userInfoMap.get("headimgurl");//头像

    member = new UcenterMember();
    member.setOpenid(openid);
    member.setNickname(nickname);
    member.setAvatar(headimgurl);
    memberService.save(member);
    }

    //使用jwt根据member对象生成token字符串
    String jwtToken = JwtUtils.getJwtToken(member.getId(), member.getNickname());
    //最后:返回首页面,通过路径传递token字符串
    return "redirect:http://localhost:3000?token="+jwtToken;
    }catch(Exception e) {
    throw new onlineEduException(20001,"登录失败");
    }
    }

    测试效果:

     2.书写前端方法

     

     3.配置nginx

     

     4.测试

  • 相关阅读:
    解决docker-compose: command not found
    idea 包存在提示不存在
    使用haproxy负载均衡
    docker使用阿里云仓库上传与下拉images
    docker使用官方仓库上传与下拉images
    WeaveScope-容器监控
    matlab打开
    硬盘测试
    matlab quiver()画箭头的函数
    SDK 和 API 的区别是什么?
  • 原文地址:https://www.cnblogs.com/dmzna/p/12861506.html
Copyright © 2020-2023  润新知