实现微信扫码登录-OAuth2-授权框架

2023-05-16

🙆‍♂️OAuth2:是一种授权框架,仅用于授权代理,针对特定问题的一种解决方案。主要可以解决两个问题,一种是开放系统间的授权,另一种是分布式之间的访问问题

🙆‍♂️开放系统间授权:通过向第三方应用授权,可以让第三方应用获得相同的权限从而使其可以执行对其他应用的操作。实现方式:用户密码复制(适用于同一公司内部系统,安全性太低),通用开发者Key(适用于合作商或不同业务部门之间),办法令牌(接近OAuth2的方法,需要考虑管理令牌,颁发令牌与销毁令牌)

🙆‍♂️分布式访问问题(单点登录):在登录成功后,返回按一定规则生成的字符串,字符串内包含用户信息,通过路径或cookie将字符串传递,后面再发送请求时,每次都带着这个字符串进行发送,当获取到这个字符串时,就可以从其中拿到用户信息。

🙆‍♂️OAuth2解决方案:令牌机制,生成一定规则的字符串,附带用户信息。

🙆‍♂️OAuth2并不是协议而是一种解决方案,它提出这种办法来解决问题但并没有规定具体怎么做,像JWT是其中一种生成规则的实现方法。

在此之前的准备工作我们需要注册微信开放平台并且进行开发者资质验证,而后进行创建应用,得到app_id、app_secret、redirect_url,这些信息,验证有些困难可以去看看码上登录。

首先进行配置文件信息的添加,我们打开用户模块的application.yml文件,将我们上面的信息添加到文件中去。

# 微信开放平台配置信息
wx:
  open:
    app_id: // id应用唯一标识
    app_secret: // 密钥
    redirect_url: // 回调地址

写个常量类把我们配置文件中的信息拿到以便于后面进行操作。

// spring初始化bean的时候,如果bean实现了InitializingBean接口,
// 会自动调用afterPropertiesSet方法
@Component
public class ConstantWxUtils implements InitializingBean {

    @Value("${wx.open.app_id}")
    private String appId;
    @Value("${wx.open.app_secret}")
    private String app_secret;
    @Value("${wx.open.redirect_url}")
    private String redirect_url;

    private static String WX_OPEN_APP_ID;
    private static String WX_OPEN_APP_SECRET;
    private static String WX_OPEN_REDIRECT_URL;

    @Override
    public void afterPropertiesSet() throws Exception {
        WX_OPEN_APP_ID = appId;
        WX_OPEN_APP_SECRET = app_secret;
        WX_OPEN_REDIRECT_URL = redirect_url;
    }
}

一、生成二维码以便扫描

        我们可以直接访问tx提供的固定地址,将一些参数信息传入进行请求后,就可以得到一个二维码。是通过https://open.weixin.qq.com/connect/qrconnect这个地址,加问号后拼接参数得到。参数有:appid:设备唯一标识 | redirect_url:使用urlEncode对链接进行处理 | response_type:填code | scope:应用授权作用域,多个作用域用逗号分隔 | state:保持请求和回调的状态,授权请求后原样带回第三方(非必须)。

    // 生成微信扫描登录的二维码
    @GetMapping("login")
    public String getWxCode() {
        // 固定地址后拼接参数
        String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s" +
                "&redirect_uri=%s" +
                "&response_type=code" +
                "&scope=snsapi_login" +
                "&state=%s" +
                "#wechat_redirect";
        // 对redirect_url进行URLEncoder编码
        String redirectUrl = ConstantWxUtils.WX_OPEN_REDIRECT_URL;
        try {
            redirectUrl = URLEncoder.encode(redirectUrl, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        // 填充占位符信息%s
        String url = String.format(baseUrl,
                ConstantWxUtils.WX_OPEN_APP_ID,
                redirectUrl,
                "leader");
        // 重定向到请求微信的地址
        return "redirect:" + url;
    }

这个注解使用@Controller,因为@RestController访问url连接会进行格式转换,导致我们访问地址失败,生成二维码失败。

我们上面做了两个操作,第一个通过向地址发送请求信息得到一个二维码,这个二维码包含了我们设置的一些配置信息,第二个是通过扫描这个二维码之后,会调用配置中的域名跳转地址:wx.open.redirect_url。在实际开发中可以直接将配置信息写成公司域名服务器上。但是在本地实现,我们需要修改本地服务端口号,并且将接口地址和域名跳转地址写成一样(这种只是为了测试使用)。

二、获取扫码人的信息 Httpclient json转换

扫描之后会有两个参数传递回来,一个是code(类似于验证码的随机唯一的值),一个是state(临时票据,原样传递)。

http://localhost:8160/api/ucenter/wx/callback?
code=081Vnm0w3MJzvZ2kbh3w3Iq5Mr1Vnm0J&
state=xxxxxx

通过得到的code,同时与id和密钥一起请求wx提供的另一个固定地址,获取到另外两个值分别为:access_token:访问凭证   与   openid:用于区分不同微信的id。

        //向认证服务器发送请求换取access_token
        String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                "?appid=%s" +
                "&secret=%s" +
                "&code=%s" +
                "&grant_type=authorization_code";
        String accessTokenUrl = String.format(baseAccessTokenUrl, ConstantWxUtils.WX_OPEN_APP_ID,
                ConstantWxUtils.WX_OPEN_APP_SECRET, code);
        String result = null;
        // 使用http工具类进行http发送get请求
        try {
            result = HttpClientUtils.get(accessTokenUrl);
        } catch (Exception e) {
            throw new LeaderException(20001, "获取access_token失败");
        }
        // 解析json字符串
        Gson gson = new Gson();
        HashMap map = gson.fromJson(result, HashMap.class);
        String accessToken = (String) map.get("access_token");
        String openid = (String) map.get("openid");

紧接着还没完,我们还需要再次拿着access_token与openid,访问wx提供的另一个固定地址,这时候我们才能最终得到扫码用户的信息。

        // 根据openid查询用户是否曾使用微信登录过
        UcenterMember member = memberService.getByOpenId(openid);
        if (member == null) {
            System.out.println("新用户,注册信息");
            // 访问微信的资源服务器,通过accessToken与openid获取用户信息
            String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
                    "?access_token=%s" +
                    "&openid=%s";
            String userInfoUrl = String.format(baseUserInfoUrl, accessToken, openid);
            // 使用httpclient发送get请求得到用户信息
            String resultUserInfo = null;
            try {
                resultUserInfo = HttpClientUtils.get(userInfoUrl);
            } catch (Exception e) {
                throw new LeaderException(20001, "获取用户信息失败");
            }
            // 解析json字符串 拿到用户头像与昵称 后面添加用户使用
            HashMap mapUserInfo = gson.fromJson(resultUserInfo, HashMap.class);
            String nickname = (String) mapUserInfo.get("nickname");
            String headimgurl = (String) mapUserInfo.get("headimgurl");

总共需要请求三次固定api网址,分别为

请求生成二维码:


"https://open.weixin.qq.com/connect/qrconnect" +
        "?appid=%s" +
        "&redirect_uri=%s" +
        "&response_type=code" +
        "&scope=snsapi_login" +
        "&state=%s" +
        "#wechat_redirect";  

请求获取token与openid:


 "https://api.weixin.qq.com/sns/oauth2/access_token" +
        "?appid=%s" +
        "&secret=%s" +
        "&code=%s" +
        "&grant_type=authorization_code";  

请求得到用户信息:


"https://api.weixin.qq.com/sns/userinfo" +
        "?access_token=%s" +
        "&openid=%s";  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现微信扫码登录-OAuth2-授权框架 的相关文章

  • COLMAP+OpenMVS实现物体三维重建mesh模型

    一 环境准备 1 COLMAP 进入COLMAP官网 xff0c 打开下载页面 xff0c 下载COLMAP程序 2 OpenMVS OpenMVS可以自己从源码下载进行编译 如果觉得编译openmvs可能要费点时间 xff0c 那也可以直
  • 解决ubuntu火狐无法上网问题

    之前安装Ubuntu时是可以上网的 xff0c 呆了一个月没怎么用突然不能搜索了 xff0c 记录一下 xff0c 已解决 只需一条命令 打开终端 xff0c 输入 sudo apt get install firefox 问题解决啦 xf
  • C语言基本数据类型int, short int, long int, long long int, unsigned int, signed int等解析

    一 普通int类型 int类型是有符号整型 xff0c 即int类型的值必须是整数 xff0c 可以是正整数 xff0c 负整数 xff0c 零 int类型取值范围因计算机系统而异 早起的16位IBM PC兼容机使用16位来存储一个int值
  • Docker容器内更新apt-get 国内加速

    Docker容器内更新源apt get的方法 由于不使用国内镜像网速缓慢 xff0c 所以使用国内镜像加速就很必要了 xff0c 但是经过博主测试大部分apt get加速都是针对Ubuntu 的 xff0c 根本解决不了Docker 容器内
  • STM32F4 422串口通信

    STM32F429 422串口通信 422串口的硬件原理图如下 xff1a 422串口和232串口不同的是引脚的电平控制 xff0c 还有DE是发送使能 xff0c 置高即可 xff1a RE是接收使能 xff0c 置低即可 422接出来的
  • Java基础学习记录

    一 基础DOS操作 dir xff1a directory 列出当前目录内容 md xff1a make directory 创建目录 rd xff1a remove directory 删除目录 cd xff1a change direc
  • 6、杂项:rtk原理简要说明

    目录 x1f345 点击这里查看所有博文 随着自己工作的进行 xff0c 接触到的技术栈也越来越多 给我一个很直观的感受就是 xff0c 某一项技术 经验在刚开始接触的时候都记得很清楚 往往过了几个月都会忘记的差不多了 xff0c 只有经常
  • 树莓派控制直流电机

    古月金真 1 直流电机 直流电机是一种将直流电能转换为机械能的装置 xff0c 被广泛的用于驱动各种设备 xff0c 如电风扇 遥控小车 电动车窗等 xff0c 在控制设备运转领域中 xff0c 它是不可或缺的一种设备 小型直流电机的的电压
  • SVN创建指定版本号的分支

    SVN创建分支下面三个选择的具体含义 xff1a 最新版本 xff08 HEAD revision in therepository xff09 直接从版本库中最新创建 xff0c 由于不需要从你的工作拷贝中传输数据 xff0c 创建过程会
  • 图像降噪算法——图像降噪算法总结

    图像降噪算法 图像降噪算法总结 图像降噪算法 图像降噪算法总结 图像降噪算法 图像降噪算法总结 前面这段时间我看了几篇和图像降噪相关的Review xff0c 给我的感觉就是SLAM这一研究领域像是一片汪洋 xff0c 而图像降噪领域则是另
  • 图像降噪算法——图像噪声模型

    图像降噪算法 图像噪声模型 图像降噪算法 图像噪声模型1 图像噪声建模2 C 43 43 代码实现3 结论 图像降噪算法 图像噪声模型 1 图像噪声建模 首先 xff0c 我们要区分图像传感器噪声和图像噪声 xff0c 图像传感器噪声我在博
  • 图像降噪算法——维纳滤波

    图像降噪算法 维纳滤波 图像降噪算法 维纳滤波1 基本原理2 C 43 43 代码实现3 结论 图像降噪算法 维纳滤波 维纳滤波是在频域中处理图像的一种算法 xff0c 是一种非常经典的图像增强算法 xff0c 不仅可以进行图像降噪 xff
  • 图像降噪算法——Variance Stabilizing Transform / Generalization Anscombe Transform算法

    图像降噪算法 Variance Stabilizing Transform Generalization Anscombe Transform算法 图像降噪算法 Variance Stabilizing Transform Generali
  • 图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID

    图像降噪算法 DnCNN FFDNet CBDNet RIDNet PMRID SID 图像降噪算法 DnCNN FFDNet CBDNet RIDNet PMRID SID1 基本原理1 1 DnCNN1 2 FFDNet1 3 CBDN
  • SLAM算法总结——经典SLAM算法框架总结

    SLAM算法总结 经典SLAM算法框架总结 SLAM算法总结 经典SLAM算法框架总结 SLAM算法总结 经典SLAM算法框架总结 从研究生接触SLAM算法到现在也有两三年了 xff0c 期间学习了很多经典的SLAM算法框架并写了一些相关的
  • 计算机视觉算法——基于Anchor Free的目标检测网络总结

    计算机视觉算法 基于Anchor Free的目标检测网络总结 计算机视觉算法 基于Anchor Free的目标检测网络总结1 CornerNet1 1 关键知识点 网络结构及特点1 2 关键知识点 正负样本匹配1 3 关键知识点 损失计算
  • 计算机视觉算法——基于Transformer的语义分割(SETR / Segmenter / SegFormer)

    计算机视觉算法 基于Transformer的语义分割 xff08 SETR Segmenter SegFormer xff09 1 SETR1 1 网络结构及特点1 1 1 Decoder 1 2 实验 2 Segmenter2 1 网络结
  • 计算机视觉算法——基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet)

    计算机视觉算法 基于深度学习的高精地图算法 xff08 HDMapNet VectorMapNet MapTR VectorNet xff09 计算机视觉算法 基于深度学习的高精地图算法 xff08 HDMapNet VectorMapNe
  • VINS-Mono关键知识点总结——前端详解

    VINS Mono关键知识点总结 前端详解 VINS Mono关键知识点总结 前端详解1 VINS Mono的前端流程概述2 setMask 函数的作用3 rejectWithF 函数的作用4 addPoints 函数和 updataID
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提

随机推荐

  • 深蓝学院《从零开始手写VIO》作业五

    深蓝学院 从零开始手写VIO 作业五 1 完成Bundle Adjustment求解器2 完成测试函数3 论文总结 1 完成Bundle Adjustment求解器 完成单目 Bundle Adjustment 求解器 problem cc
  • VIO在走廊弱纹理环境下的优化——VINS-Mono的点线紧耦合优化

    VIO在走廊弱纹理环境下的优化 VINS Mono的点线紧耦合优化 VIO在走廊弱纹理环境下的优化0 前言1 思路概述1 1 Super Pixel SLAM1 2 Edge SLAM1 3 PL SLAM 2 算法实施2 1 Edge S
  • SLAM综述:激光雷达与视觉SLAM(2019.10.12)

    本文基于https arxiv org pdf 1909 05214v2 pdf 进行阐述 xff08 其实差不多就是精简版翻译 xff09 第一节概述 第二节讲述激光SLAM xff1a 激光传感器 xff0c 开源系统 xff0c 深度
  • HAL库串口收发

    1 通讯方式介绍 在微处理器和外部通信模块之间主要有并行通信和串行通信两种 并行通讯传输速率快 xff0c 但是占用引脚较多 xff0c 串行通信与之相反 串行通讯分别有单工 半双工 全双工三种模式 单工 xff1a 只能发送数据或者只能接
  • ros 启动

    绑定usb设备端口号 11条消息 Ubuntu下绑定串口的两种方式ID法和serial法 haley du的博客 CSDN博客 11条消息 Ubuntu usb设备端口号绑定 一抹烟霞的博客 CSDN博客 2 2执行 1 执行相关launc
  • c++中“::“表示含义

    1 表示 域操作符 例 xff1a 声明了一个类A xff0c 类A里声明了一个成员函数void f xff0c 但没有在类的声明里给出f的定义 xff0c 那么在类外定义f时 xff0c 就要写成void A f xff0c 表示这个f
  • ROS自学笔记整合-串口通信篇

    ROS自学笔记整合 串口通信篇 最近也是刚开始接触ROS xff0c 然后买了一本古月大神的 ROS机器人开发实践 自己在捣鼓 本人编程小白 xff0c 只能做代码的搬运工 书本上的仿真基本都看的差不多了 xff0c 也动手做了不少例子 x
  • docker宿主机ssh免密

    若要实现免密登陆 xff0c 意味着无论是宿主机 xff0c 还是容器都要彼此交互公钥 xff1a 容器A发送自身公钥给中心机器 xff0c 统一由中心机器 xff0c 回发全部需要ssh到容器A的公钥信息 xff0c 任何一个新加入的容器
  • redis指定配置文件启动失败

    redis指定配置文件启动失败 redis指定配置文件启动失败 redis server redis conf失败 但是直接执行redis server是可以成功的 之所以没有启动成功 xff0c 且没有报错的原因是 在自己的redis c
  • Ubuntu 查看磁盘空间及目录容量

    Ubuntu 查看磁盘空间及目录容量 http www zhcn org 548 Df命令是linux系统以磁盘分区为单位查看文件系统 xff0c 可以加上参数查看磁盘剩余空间 xff1a df hl 显示格式为 xff1a 文件系统 容量
  • VS(Visual Studio)与VC(Visual C++)版本对应关系

    VS全名是Microsoft Visual Studio xff0c 是很大的一个开发环境 xff0c 包含很多高级语言的开发环境 xff0c VC只是VS其中的一个开发环境 VC版本与VS版本对应关系如下所示 xff1a Visual S
  • docker 状态Removal In Progress,rm提示无法删除

    docker 无法删除场景 docker 进入Removal In Progress状态 xff0c 无法直接删除 1 docker rm f 容器 提示文件无权限操作 2 xxxx 表示上图的文件路径 需要登录到宿主机上 xff0c 执行
  • windows上安装启动pgsql,postgres

    windows上安装启动pgsql postgres 1 在官网下载pgsql2 进入pgsql的安装目录 bin 下面3 windows 启动 pgsql server cmd窗口退出 server关闭4 注册成服务 cmd窗口退出 se
  • django调试问题django.core.exceptions.ImproperlyConfigured

    django项目调试子应用app时提示缺少配置 1 项目的settings文件里面设置的有子app xff0c 依旧提示下面问题 django core exceptions ImproperlyConfigured Requested s
  • Python 数据描述符

    今天看到一篇文档介绍了Python描述符 xff0c 转发学习下 1 默认的属相访问是从对象的字典中 get set 或者 delete 属性 xff1b 例如a x的查找顺序是 a x gt a dict x gt type a dict
  • pycharm中terminal中使用git bash替换cmd(无弹窗)

    pycharm中terminal中使用git bash替换cmd 1 背景 系统 xff1a windows 想要在pycharm上的terminal中使用git bash而不是系统自带的cmd 可以调用基础的Linux命令 比如ls 等
  • linux安装 python3-pip没有安装候选项

    问题 环境 xff1a linux ubuntu span class token number 22 04 span 版本 LTS windows xff1a 使用vmware 执行以下命令报错 span class token func
  • django连接elasticsearch失败Failed to establish a new connection: [Errno 113] No route to host[Errno 111]

    做django商城项目时报错 错误信息 urllib3 exceptions NewConnectionError lt urllib3 connection HTTPConnection object at 0x7fa6b2537390
  • python爬虫数据采集使用的三种匹配方式:正则re,xpath,beautifulsoup4

    一般情况下三种方式都是可以匹配到结果的 xff0c 只是复杂程度不一致 xff0c 根据情况进行选择re xpath bs4 先进行简单的比较 xff1a 一 正则re的使用二 lxml三 bs4 的使用 先进行简单的比较 xff1a 抓取
  • 实现微信扫码登录-OAuth2-授权框架

    x1f646 OAuth2 xff1a 是一种授权框架 xff0c 仅用于授权代理 xff0c 针对特定问题的一种解决方案 主要可以解决两个问题 xff0c 一种是开放系统间的授权 xff0c 另一种是分布式之间的访问问题 x1f646 开