OAuth 2.0 - 微信登录

一、概述

1、什么是OAuth 2.0

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

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

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

协议特点:

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

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

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

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

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

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

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

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

3、对于第三方平台而言

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

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


二、Java生成二维码

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

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

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

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

准备工作

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

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

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

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

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

 

nullicon-default.png?t=N7T8https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

代码实现

引入依赖

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"));
    }
}

纠错级别

代码步骤

    @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());

    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实例分割论文精读:Mask R-CNN

1.摘要 本文提出了一种概念简单、灵活、通用的实例分割方法&#xff0c;该方法在有效地检测图像中的物体同时&#xff0c;为每个物体实例生成一个实例分割模板&#xff0c;添加了一个分支&#xff0c;用于预测一个对象遮罩&#xff0c;与现有的分支并行&#xff0c;用于边界框…

【Unity】【VRTK】【Pico】如何快速在VRTK中引入带动画的PICO控制器

【背景】 之前的VRTK篇章中,我只介绍了Oculus,Open VR,SImulator这三种Rig的配置方法,那么Pico如何融合VRTK进行开发呢? 【需要的开发包】 先像一个正常PICO项目那样导入PICO的SDK到Unity。VRTK 4的Package导入器中搜Pico,可以导入一个Pico的Integration,导入后Projec…

陀螺仪LSM6DSV16X与AI集成(6)----检测自由落体

陀螺仪LSM6DSV16X与AI集成.6--检测自由落体 概述视频教学样品申请源码下载生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置 概述 本文介绍如何初始化传感器并配置其参数&#xff0c;以便在检测到自由落体事件时发送通知。 最近…

回归预测 | Python基于ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM多输入单输出回归预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 原创改进&#xff0c; ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM 多输入单输出回归 python代码 优化参数&#xff1a;filter,unints1,units2&#xff0c;学习率&#xff08;可添加&#xff09; 以下是三个主要的改进点&…

Echarts折线图中数据根据正负数显示不同区域背景色-配置

示例 Echarts折线图中数据根据正负数显示不同区域背景色 Piecewise 分段类型Continuous 连续类型 Echarts配置 option {backgroundColor: "#030A41",xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun],axisTick: {show: false,},axisLabel: { /…

【Git】本地仓库管理远程库(GitHub)——clone(下载)、commit(添加到本地仓库)、push(提交到远程仓库)、pull(拉取)操作

目录 使用远程仓库的目的将本地仓库同步到git远程仓库 1.克隆远程仓库(clone)2.新建一个文件3.将工作区的文件添加到暂存区4.将暂存区的文件添加到本地仓库(commit)5.提交(同步)到远程仓库(push)6.远程库拉取到本地库(pull)7.团队协作开发和跨团队协作开发(开源项目) 使用远程…

翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一 1. 使用Streamlit显示图表Graphs 1.1 为什么我们需要可视化&#xff1f; 数据可视化通过将数据整理成更容易理解的格式来讲述故事&#xff0c;凸显趋势和异常点。好的可视化能够讲述一个故…

CAN总线报文格式---远程帧(遥控帧)

远程帧&#xff08;Remote frame&#xff09; 用于向远程节点请求数据。远程帧可分为标准远程帧和扩展远程帧。&#xff08;远程帧又称为遥控帧&#xff09; 通常ECU&#xff08;Electronic Control Unit&#xff09;会通过数据帧主动发送相关数据&#xff0c;但某些情况也可能…

redis数据结构源码分析——跳表zset

文章目录 跳表的基本思想特点节点与结构跳跃表节点zskiplistNode属性 跳跃表链表属性 跳表的设计思想和优势API解析zslCreate&#xff08;创建跳跃表&#xff09;zslCreateNode&#xff08;创建节点&#xff09;zslGetRank&#xff08;查找排位&#xff09;zslDelete&#xff0…

jenkins-cl参数化构建

pipeline片段&#xff08;对应jenkins-cli -p参数的BRANCHdevelop&#xff09; parameters {string(name: BRANCH, defaultValue: master, description: Enter the branch name)}stages {stage(Get Code) {steps {script {def branch params.BRANCHcheckout scmGit(branches: …

关于AMC8模拟考试延长到1月19日14点,以及常见的几个新问题

相信过去的周末两天&#xff0c;很多参加今年AMC8美国数学思维竞赛活动的孩子们都参加了AMC8模拟考试。昨天有家长问六分成长&#xff0c;周末两天因故没能参加要不要紧&#xff1f;如果还想参加怎么办&#xff1f; 不用担心&#xff01;官方已经把AMC8模拟考试的时间延长到1月…

c#异形窗体遮罩效果

c#异形窗体遮罩效果&#xff0c;移动&#xff0c;关闭&#xff0c;最大化&#xff0c;最小化&#xff0c;还原操作 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D…

《WebKit 技术内幕》之二: HTML 网页和结构

第二章 HTML 网页和结构 HTML网页是利用HTML语言编写的文档&#xff0c;HTML是半结构化的数据表现方式&#xff0c;它的结构特征可以归纳为&#xff1a;树状结构、层次结构和框结构。 1.网页构成 1.1 基本元素和树状结构 HTML网页使用HTML语言撰写的文档&#xff0c;发展到今…

基于MOD02/MYD02获得亮度温度再转冰温

用HEG处理MOD02/MYD02,提取里面的EV_1KM_Emissive波段,band为11和12(其实就是band 31和32)。注意这里的band和output dile type 1. 获得之后,转辐射亮度。 参考:https://www.cnblogs.com/enviidl/p/16539422.html radiance_scales,和radiance_offset这两项参数代表波段…

你好2024,OpenStreetMap 20 周岁

2004年&#xff0c;OpenStreetMap在英国诞生。2024年&#xff0c;OpenStreetMap 满 20 周岁&#xff0c;其愿景是创建一个免费的、可编辑的世界地图。当时&#xff0c;地图数据的获取往往受到限制或价格昂贵1。 经过20年的发展&#xff0c;该数据集合成为了最为全面的街道级别开…

通过eXtplorer+cpolar,搭建个人云存储并实现访问内网服务器数据

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 在数字时代&#xff0c;互联网传输文件已成为我们日常生活和工作的核心部分。…

消息的发送与接收

消息的发送与接收 消息的发送与接收不仅仅是在于聊天功能的实现。其实还有很多种情况也算"消息的发送与接收"。而且我们还可以通过多种方法去实现。我们可以基于实际情况来选择。 WebSocket实现 node做后端。找了好多&#xff0c;前端页面总是用到了jQuery&#x…

SK入门第一篇(设置baseurl)

问题说明 之前在一些公众号就看到了关于SK的开发文章&#xff0c;然后说自己也试试看。然后就遇到一个关于如何设置baseurl的问题。啥意思呢&#xff1f;同样是SK&#xff0c;用python语言的话&#xff0c;OpenAI的baseurl是可以直接设置的&#xff0c;但是在C#下没法直接设置…

爬虫-6-数据提取-beautifulsoup4

#声明:本文仅供学习。 (●—●)

JVM:双亲委派机制类加载器

JVM&#xff1a;双亲委派机制 1. 例子2. 类加载器总结3. 类加载过程4. 双亲委派模型的执行流程&#xff1a;5. 双亲委派模型的好处 1. 例子 Java运行时环境有一个java.lang包&#xff0c;里面有一个ClassLoader类 我们自定义一个String类在java.lang包下&#xff0c;下面的…