OAuth 的核心

OAuth 的核心就是向第三方应用颁发令牌。OAuth提供了四种获取令牌的授权方式
授权码(authorization-code)、隐藏式(implicit)、密码式(password)、客户端凭证(client credentials)。
而微信登陆采用的是授权码模式。

背景

目前项目大多都是采用前后端分离模式开发。本文前端采用 vue ,后端采用spring boot + spring cloud 实现的一套微服务架构,
采用独立的授权服务器进行网站授权、颁发token。
当然开发微信登陆需要去微信开放平台https://open.weixin.qq.com注册用户,添加网站应用如:

并获取appid、appSecret、redirect_uri。
appid:应用唯一标识微信通过这个id来识别是那个网站应用来访问的。
appSecret:应用接口使用密钥,要严格保密。一般保存在后台服务器上。
redirect_uri:微信开放平台授权回调域,用户扫描二维码并同意授权之后回调的域名。

开发整个流程:

  1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  2. 通过code参数加上AppID和AppSecret等,通过API换取access_token、openid;
  3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

开发

一、vue前端页面展示微信二维码(将微信二维码内嵌到我们自己的网站上)
通过阅读微信开放平台上的文档我们了解到。
当需要展示微信二维码时,我们需要实例化一个js对象

 var obj = new WxLogin({self_redirect:true,id:"login_container", appid: "", scope: "", redirect_uri: "",state: "",style: "",href: ""});

redirect_uri中的地址需要处理一下的。处理方式:通过JavaScript encodeURIComponent() 函数。
参数说明

当然只实例化这个js对象是无法展示二维码的,我们需要引入微信官方提供的js文件。
在vue的生命周期函数mounted中。

mounted() {const s = document.createElement('script');s.type = 'text/javascript';s.src = 'http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js';document.body.appendChild(s);},

二、授权回调域
实例化js对象时。我们写了redirect_uri回掉域名。我是将回掉地址放到了前端页面,然后通过回调地址中时候带有code参数来判断,是否向后台发送接口请求(用户拒绝授权时,回掉地址上回没有code参数的)
1、如果回掉地址中带有code则发送后台接口访问。
后台配置文件中添加

使用如下链接:https://api.weixin.qq.com/sns/oauth2/access_tokenappid=%s&secret=%s&code=%s&grant_type=authorization_code
发送一个http请求获取openid、access_token。
然后通过
https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
可以拿到用户的相关信息。

三、前端重定向
用户有可能在不同的页面进行点击登陆,因此当用户登录成功之后需要重定向到用户点击登陆的地址也是非常不错的用户体验。
我采用的是通过Cookie,用户点击登陆时,我就将当前页面的路径保存到Cookie中,然后通过访问后台接口返回的参数来确定用户是重定向到点击登陆页面还是重定向到其他页面。
this. r o u t e . q u e r y : 参 数 。 可 以 获 取 路 径 上 的 参 数 。 t h i s . route.query:参数。可以获取路径上的参数。 this. route.query:参数。可以获取路径上的参数。this.router.push({path: Cookie.get(“loginUrl”),query:{‘type’: 2}}):可以重定向到Cookie保存的路径,query是路径上的参数。
this.$route.path:获取当前路径。

四、微信解除绑定
首先微信开放平台上没有提供相关接口。
我采用的还是绑定那一套,获取用户openid,然后在我们本地上去除绑定即删除用户保存的openid。
五、请求微信接口数据乱码
根据微信提供的接口
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
我们可以获取到用户信息,但是通常情况下数据都是乱码的。
因为微信那边采用的是“ISO-8859-1”编码,而我们一般采用“UTF-8”,编码不统一导致的乱码。
既然问题的原因找到了,那我们就开始解决吧:
通过微信提供的公共接口获取的信息是一个JSON字符串
将JSON字符串通过“ISO-8859-1”解码,然后通过“UTF-8”编码成一个新的JSON字符串,此时就可以解决获取用户信息中文乱码问题。
示例代码:

json = new String(vxUserDetail.getBytes("ISO-8859-1"), "UTF-8");

spring security oauth2 实现微信登陆(授权回调域、前端重定向、微信解绑、获取用户信息中文乱码等相关问题解析)相关推荐

  1. 微信开发--获取用户信息中文乱码的解决方案

    为什么80%的码农都做不了架构师?>>>    在微信开发中我们会经常需要获取用户的信息. 微信给我们提供了获取用户信息的api, 地址为 https://api.weixin.qq ...

  2. 微信公众号开发--获取用户信息中文乱码的解决方案

    在微信开发中我们会经常需要获取用户的信息. 微信给我们提供了获取用户信息的api, 地址为 https://api.weixin.qq.com/cgi-bin/user/info?access_tok ...

  3. java微信公众号中文乱码,java微信公众平台获取用户信息中文乱码解决办法(第十五课)...

    开发者在开发微信公众平台的时候,往往需要获取关注公众号的基本用户信息,其中信息中含有中文,但是根据微信官方文档,调用接口返回的用户json字符串信息中含有中文乱码,我们先来看看接口调用地址. 参数描述 ...

  4. 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)

    之前写过一篇微信公众号开发–自定义菜单跳转页面并获取用户信息 由于当时是刚学习微信公众号开发当时的思路虽然可行,不过不是最好的,最近也用到了需要获取用户信息的地方,再次整理一下. 流程 注意点 ### ...

  5. 公众号如何跳转到页面php,图文详解微信公众号开发自定义菜单跳转页面并获取用户信息实例...

    这篇文章主要介绍了微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解的相关资料,需要的朋友可以参考下 微信公众号开发 自定义菜单 请先读完本文再进行配置开发 请先前往微信平台开发者文档阅读&qu ...

  6. 从零开始超详细的Spring Security OAuth2.0实现分布式系统授权(注册中心+网关+认证授权服务(JWT令牌验证)+资源调用服务)

    文章目录 一.OAuth2.0 1.介绍 2.例子 3.执行流程 二.Spring Cloud Security OAuth2 1.环境介绍 2.认证流程 三.整合分布式项目 1.技术方案 2.项目结 ...

  7. Spring Security oauth2.0微信小程序登录

    微信小程序前期开发准备,可以参考这篇文章微信小程序前期准备 1.学习过Spring Secrity oauth2.0的都知道,他有四种登录模式可以选择 authorization code(授权码模式 ...

  8. java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

    微信公众号开发 自定义菜单 请先读完本文再进行配置开发 请先前往微信平台开发者文档阅读"网页授权获取用户基本信息"的接口说明 在微信公众账号开发中,往往有定义一个菜单,然后用户点击 ...

  9. php支付宝第三方授权,原生 PHP 实现支付宝 App 第三方登录获取用户信息,_PHP_ 少侠科技...

    详细内容 背景 App 项目要求实现第三方 微信 和 支付宝 登录,微信可以直接在 App 端完成认证拿到用户信息,支付宝则需要后端获取. 流程 1.服务端先拿到 App 端 调用 支付宝 SDK 所 ...

最新文章

  1. pybind 填充数组
  2. FACEBOOK’S CALIBRA
  3. 【数据库系统概论】考研重点章节分析【0】
  4. 第四单元用计算机写作,计算机复习题
  5. fedora 安装Linux源码,如何在 Fedora 29/30 上安装 VS Code
  6. C语言 vprintf 函数 - C语言零基础入门教程
  7. python中update什么意思_如何在Python中更新字典中键的值?
  8. java 数字运算异常_Java基础之:异常及异常处理
  9. C++ 1 三字符组
  10. java上下文的作用_Spring中的应用程序上下文有什么作用? - java
  11. 知网论文[全PDF下载],从此告别CAJ阅读器
  12. Drools7中文教程 文档 指南
  13. Winlogon、LSASS、Userinit
  14. 分享一个蛋白互作网站——String (一)
  15. java vo层_JAVA3个数据层(pojo,dto,vo)、dao层、services层、controller层解释
  16. 火线安全:Log4j2 史诗级漏洞波及全球6万+开源软件
  17. swiper网格布局
  18. 网易微专业java高级笔记_网易微专业java高级开发工程师
  19. 一分钟解决你的公有云私有云选择困难症
  20. 关于前几天的招聘,我说几点

热门文章

  1. Java——BigInteger
  2. jQuery使用手册(3)
  3. 如何将excel表格导入word_「超百科0341」如何批量导入excel数据到指定格式的word表格?...
  4. idea (linux版本)输入法无法跟随光标解决
  5. 教你建一个别人看不到打不开的文件夹
  6. eclipse svn插件
  7. 学习Vue2.x这一篇就够了
  8. chimee hls m3u8
  9. publisher是干什么的
  10. Android之原生分享视频至微信