OAuth 2.0 - 微信登录

news2024/11/28 20:37:40

一、概述

1、什么是OAuth 2.0

OAuth (Open Authorization) 是一个关于授权 (athorization) 的开放网络标准。

允许用户授权第三应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方。OAuth在全世界得到广泛应用,目前的版本是2.0版。

允许用户提供一个令牌而不是用户名和密码来访问他们存放在特定服务提供者的数据。

协议特点:

  • 简单: 不管是OAuth服务提供者还是应用开发者,都很易于理解与使用
  • 安全:没有涉及到用户密钥等信息,更安全更灵活;
  • 开放: 任何服务提供商都可以实现OAuth,任何软件开发商都可以使用OAuth

授权码模式 是最常用的模式

2、使用第三方登录的原因和好处?

  • 第三方登录简单快捷,面对不同平台不同的用户名和密码的问题,第三方登录正好解决这个问题,几乎可以直接一个账号搞定所有
  • 第三方登录还可以将自己在某个应用的动态信息同步到当前应用下,无需还在为每个应用重新写个人资料
  • 第三方登录有很多资料信息可以公用 (比如头像和昵称) ,通常对于敏感资料如手机、邮箱是第三方平台是不会提供的,所以安全信息可以放心

 总的来说它可以简化登录过程,降低注册门槛,更能获取海量用户有效降低了用户的流失。

因此本地注册的稳定+第三方登录的便捷才是最合适的登录方案

第三方登录接入后,应用可直接获取用户昵称、头像、用户ID等信息,方便产品获取用户的基本资料,减少产品设计成本

目前市面上的短信验证码的价钱约在0.05元左右,当用户选择使用第三方登录时,可有效减少产品的登录成本。

3、对于第三方平台而言

增加用户对平台的依赖,用户越多使用本平台的第三方登录,就代表着平台对该用户的粘性越高

获得更广泛的影响力,只要用户使用提供第三方登录的应用,那么这个提供第三方登录的品牌就会被用户浏览,有利于对平台的拉新和促活


二、Java生成二维码

二维码(dimensionalbarcode),又称二维条码,是在一维条码的基础上扩展出的一种具有可读性的条码。设备扫描二维条码,通过识别条码的长度和宽度中所记载的二进制数据,可获取其中所包含的信息

简而言之,二维码是信息的载体

比如我们可以将一个网站写入二维码,扫描这个二维码就可打开这个网站。生成二维码我可以直接使用在线的网站生成

但是我们在写程序的时候肯定是无法每次都打开在线网站生成二维码, 因此我们需要导入依赖在java中生成二维码

代码实现

引入依赖

HuTool是一个Java工具包类库,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类。

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.5</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>
public class CodeUtil {
    public static void main(String[] args) {
        QrCodeUtil.generate("https://blog.csdn.net/m0_56308072?spm=1000.2115.3001.5343",
                300,300, FileUtil.file("d://qrcode.jpg"));
    }
}

纠错级别


三、微信开发平台

 准备工作

通常,扫码登录微信有两种实现方式

1、基于微信公众号平台的扫码登录

        让第三方应用投入微信的怀抱而设计,这里的第三方指的是比如android、ios、web网站等

2、基于微信开放平台的扫码登录

        为了让开发人员利用微信自家的技术,开发公众号、小程序而准备的

我们这里使用微信公众号平台扫码登录实现微信登录,因此需要先申请测试公众号

在这里 微信公众平台 申请

首先我们配置接口信息,注意这个URL是你自己的服务器资源。当点击提交之后,微信服务器就会发送一个GET请求到填写的服务器地址URL上。

 首先,这个GET请求携带的参数为

参数描述
signature微信加密签名,signature结合了开发者填写的token和底下那两个时间戳和随机数
timestamp时间戳
nonce随机数
echostr随机字符串

 这个GET请求发送至我们指定服务器之后,我们需要将其中的参数echostr再return回去,这样是为了告诉微信服务器接入shen了,成为开发者成功;否则接入失败。

加密/校验流程如下

此时我的后端接口为

    @GetMapping(value = "/wx", produces = "text/plain;charset=utf-8")
    public String authGet(
            @RequestParam(name = "signature", required = false) String signature,
            @RequestParam(name = "timestamp", required = false) String timestamp,
            @RequestParam(name = "nonce", required = false) String nonce,
            @RequestParam(name = "echostr", required = false) String echostr) {

        log.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature,
                timestamp, nonce, echostr);

        return echostr;
    }

注意:此时我们运行起来的springboot服务器是运行在本地的,而上面微信服务器是无法找到我们本地的服务器的。

经过测试,我发现他需要满足两个条件

  1. 公网上可访问
  2. 如果使用HTTPS协议,那么就需要有安全的SSL证书

公网上可访问就是指别人或者自己使用不同的网就可以直接访问到我们的网站或者接口,安全SSL证书就是当我们使用https的时候不要报危险

因此为了解决这个问题,我们除了直接将我们springboot服务部署在云服务器上,我们还可以使用内网穿透,将我们的服务器端口暴露在公网上

然后如果你使用https协议的话建议在腾讯云上申请一个域名然后使用腾讯云免费的SSL

具体步骤看这篇博客

springboot开启HTTPS-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_56308072/article/details/135573717?spm=1001.2014.3001.5501

最后 出现配置成功字样即可

之后就是修改网页账号 - 网页授权获取用户基本信息

注意: 这个回调域名不要加协议,不要写端口号、接口,只能写域名

微信网页开发 / 网页授权 (qq.com)icon-default.png?t=N7T8https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

 代码步骤

    @GetMapping("/wxLogin")
    @ResponseBody
    public void wxLoginPage(HttpServletResponse response) throws Exception{
        //回调地址
        String redirectUrl = URLEncoder.encode("https://an1ong.online:47727/wxCallback","UTF-8");
        //构造二维码链接地址
        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=" +
                redirectUrl + "&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";

        response.setContentType("image/png");

        //生成二维码
        QrCodeUtil.generate(url,300,300,"jpg",response.getOutputStream());

    }

这步调用该接口之后会生成一个二维码,扫描该二维码就会回调/wxCallback接口 

请求方法

获取code后,请求以下链接获取access_token:

https://api.weixin.qq.com/sns/oauth2/access_token?

appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

        //构造Http请求客户端
        HttpClient httpClient = HttpClients.createDefault();


        //用code交换token.code,code为扫码后的微信服务器响应来的值
        String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ appId +"&secret=" + secret + "&code={}&grant_type=authorization_code";

        //发请求
        HttpGet httpGet = new HttpGet(tokenUrl);

        String responseResult = "";

        //结束返回的数据,转成utf-8格式
        HttpResponse response = httpClient.execute(httpGet);
        if (response.getStatusLine().getStatusCode() == 200){
            responseResult = EntityUtils.toString(response.getEntity(),"UTF-8");
        }

        log.info("获取accessToken结果: [{}}",responseResult);

        //将结果封装到TokenInfo对象中
        TokenInfo tokenInfo = JSON.parseObject(responseResult,TokenInfo.class);

http:GET(请使用https协议):

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

        //用accessToken获取个人扫码信息
        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+ tokenInfo.getAccessToken() +"&openid=" + tokenInfo.getOpenId() + "&lang=zh_CN";

        //构造http请求客户端
        HttpGet httpGet1 = new HttpGet(userInfoUrl);

        //接收数据
        HttpResponse response1 = httpClient.execute(httpGet1);
        if (response1.getStatusLine().getStatusCode() == 200){
            responseResult = EntityUtils.toString(response1.getEntity(),"UTF-8");

        }

        log.info("获取个人信息返回:{}",responseResult);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言【paleobioDB】——pbdb_orig_ext():绘制随着时间变化而出现的新类群

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_orig_ext (data, rank, temporal_extent…

核对表:基本数据类型CHECKLIST:Fundmental Data

核对表&#xff1a;基本数据类型CHECKLIST:Fundmental Data 数值概论 代码中避免使用神秘数值吗&#xff1f; 代码考虑了除零错误吗&#xff1f; 类型转换很明显吗&#xff1f; 如果在一条语句中存在两个不同类型的变量&#xff0c;那么这条语句会像你期望的那样求值吗&#x…

JMeter 相关的面试题

1、什么是 JMeter&#xff1f; 它是一个开源的负载和性能测试工具&#xff0c;用于对软件、Web应用程序、API、数据库等进行压力测试。 2、JMeter 的优势是什么&#xff1f; JMeter具有以下优势&#xff1a; 开源免费&#xff1a;JMeter是开源工具&#xff0c;无需付费使用。…

使用 Elasticsearch 和 LlamaIndex 进行高级文本检索:句子窗口检索

2023 年是检索增强生成 (RAG) 的一年&#xff0c;人们探索了许多用例&#xff0c;并使用该技术开发了数百种产品。 从 Q/A 聊天机器人到基于上下文的代理&#xff0c;RAG 的使用一直是 LLM 申请快速增长的主要因素。 支持不断发展的社区以及 Langchain 和 LlamaIndex 等强大框架…

vue-cli解决跨域

在vue.config.js中 找到devServer 在devServer中创建proxy代理 proxy:{ path&#xff08;路径中包含这个path就会导航到target的目标接口&#xff09;&#xff1a;{ target:"目标接口" } } 例&#xff1a; 1 同源策略只针对于浏览器&#xff0c;代理服务器到后端接…

如何选择适合的乔拓云小程序付费服务

在数字化时代&#xff0c;微信小程序已经成为商家与客户互动的重要平台。乔拓云小程序作为一款便捷的微信小程序&#xff0c;不仅提供免费的基本功能&#xff0c;还为商家提供了多种付费增值服务和广告投放选择&#xff0c;以满足不同需求。本文将为您揭秘乔拓云小程序的费用明…

SpringBoot多环境配置与添加logback日志

1、多环境配置 一个项目会有多个运行环境 所以SpringBoot提供了可以适应多个环境的配置文件 每个文件对应一个端口号 application-dev.yml 开发环境 端口8090 application-test.yml 测试环境 端口8091 application-prod.yml 生产环境 端口8092 在application中选择使用哪个…

中国社会科学院与新加坡社科院大学联合培养博士——如何就读在职博士

说到了在职博士&#xff0c;可能会大家就会觉得这不就是字面意思嘛&#xff1f;还用什么懂不懂的&#xff0c;在职博士的意思不就是&#xff0c;在职就是上班&#xff0c;博士就是博士&#xff0c;意思就是上班读的博士&#xff0c;当然是对的啊&#xff0c;但是知道字面意思之…

如何成为一个有趣的程序员

要成为一个有趣的程序员&#xff0c;你可以从以下几个方面着手&#xff1a; 专业技能与独特视角&#xff1a; 深入掌握至少一种编程语言&#xff0c;并了解其背后的原理和应用场景。不断学习新的编程技术、框架或工具&#xff0c;并尝试将其应用于实际项目中&#xff0c;展示你…

【基础数据结构】二叉树的基本性质

例题1 单值二叉树 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;true示例 2&#xf…

Spring MVC学习——解决请求参数中文乱码

解决请求参数中文乱码问题 1.POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><…

计算机组成原理-程序中断方式完整流程

文章目录 程序中断方式完整流程例题小结 程序中断方式完整流程 首先CPU通过执行IO指令来启动外部设备&#xff0c;此时外部设备可以开始做准备工作了&#xff08;准备CPU想要的数据或者信息&#xff09;&#xff0c;在外部设备准备过程中&#xff0c;CPU可以继续执行原程序的内…

C++初阶类与对象(一):学习类与对象、访问限定符、封装、this指针

入门知识已经梳理完毕了&#xff0c;接下来就进入到面型对象的部分学习了 文章目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义3.1类的结构3.2类的两种定义方式3.2.1声明和定义全部放在类体中3.2.2声明和定义分开 3.3成员变量命名规则的建议 4.类的访问限定符及封装4.1…

python贪吃蛇游戏

为了实现这个游戏&#xff0c;需要用到Python的pygame模块&#xff0c;它是一个专门用于开发游戏的模块&#xff0c;提供了很多方便的功能&#xff0c;比如窗口、图形、音效、事件处理等。 用pygame来创建一个窗口&#xff0c;设置游戏的背景色&#xff0c;画出蛇和食物&#…

73.网游逆向分析与插件开发-背包的获取-物品数据的初步数据分析

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;72.网游逆向分析与插件开发-背包的获取-项目需求与需求拆解-CSDN博客 然后首先找切入点&#xff1a; 通过药物来当切入点&#xff0c;药物比较好使用&#xff0c;然后鼠标放到药物上它有名字、种类、…

C++I/O流——(4)格式化输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

美易官方:盘前:道指期货跌0.4% “恐怖数据”将发布

盘前&#xff1a;道指期货跌0.4% “恐怖数据”将发布 在今日的盘前交易中&#xff0c;道琼斯工业平均指数期货小幅下跌0.4%&#xff0c;市场正在等待即将发布的“恐怖数据”——美国零售销售数据。这一数据被视为衡量美国经济健康状况的重要指标&#xff0c;因此备受关注。 由于…

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(6)解散部门

指路&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;3&#xff09;&#xff08;4&#xff09;&#xff08;5&#xff09;&#x1f447; 黑马程序员JavaWeb开发|案例&#xff1a;tlias智能学习辅助系统&#xff08;1&#xff09;准备工作、部门管理_tlias智能…

实战 | OpenCV两种不同方法实现粘连大米粒分割计数(步骤 + 源码)

导 读 本文主要介绍基于OpenCV的两种不同方法实现粘连大米分割计数,并给详细步骤和源码。源码和图片素材见文末。 背景介绍 测试图如下,图中有个别米粒相互粘连,本文主要演示如何使用OpenCV用两种不同方法将其分割并计数。 方法一:基于分水岭算法 基于分水岭算法…

c++多态与虚函数

多态是什么&#xff1f; 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个核心概念&#xff0c;它来源于希腊语&#xff0c;意为“多种形态”。 从字面意思理解&#xff0c;多态是指函数有多种形态&#xff08;实现&#xff09;。换句话说&#xff0c;运行阶段…