前言

第三方登录是应用开发中的常用功能,通过第三方登录,我们可以更加容易使用户登录我们的应用或者网站。

很多网站都提供了第三方登录的功能,在他们的官网中,都提供了如何接入第三方登录的文档。但是,假如不同的网站文档差别极大,那么对于不了解第三方登录的新手来说,实现一个支持多网站第三方登录的功能可以说是极其痛苦。

实际上,大多数网站提供的第三方登录都遵循OAuth协议,虽然大多数网站的细节处理都是不一致的,甚至会基于OAuth协议进行扩展,但大体上其流程是一定的。

本篇文章以微信网页授权来介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式

OAuth是什么?

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

允许用户提供一个令牌而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

OAuth2.0官方文档为:https://tools.ietf.org/html/rfc6749

为什么是OAuth2.0呢?其实是有1和1.1版本的,只是因为1和1.1版本流程比较复杂,应用不是很广泛。

授权码模式流程

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与 "服务提供商" 的认证服务器进行互动。

整体大致过程如下:


OAuth2.0应用场景

我们这里主要模拟在微信公众号中使用OAuth2.0进行授权,获取用户的基本信息的过程。

第1步:引导用户进行授权:

当用户希望使用第三方登录进行登录时,第三方应用会通过类似下图的方式将用户引导至授权页面URL。

登录方式

如:需要获取微信用户信息时,需要引导用户点击请求如下授权页面URL。

//open.weixin.qq.com/

请求参数详细介绍如下

参数 必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type 返回类型,只能填写code
scope 应用授权作用域
snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid)
snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地等。并且即使在未关注的情况下,只要用户授权,也能获取其信息 )
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

第2步:用户授权

当我们点击授权页面URL时,会出现以下授权页面

微信授权页面

该页面由认证服务器提供,认证服务器会告诉用户该第三方在认证服务器中提交的相关信息,以及授权后第三方应用能够获取哪些资源。在微信中,最基础的认证可以访问用户的公共信息。

第3步:返回用户授权码(Code)

当用户同意授权后,认证服务器将生成一个用户授权码(Code),此时认证服务器如何将用户授权码(Code)传递给第三方应用呢?

当我们向认证服务器提交应用信息时,通常需要填写一个redirect_uri,在微信公众号的接口权限中


点击修改(授权回调域名配置规范为全域名并且不带http)

服务器中填写回调域名

在第1步中,当我们引导用户进入授权页面时,也会附带一个redirect_uri的信息。当认证服务器验证两个域名一致或在该域名的子域名下,便会通知浏览器跳转到redirect_uri,同时会在后面附加用户授权码(code)的相关信息。授权后访问的redirect_uri如下:

//xxx.com/oauth2?code=0217LHck2XfL3D0sbVfk2cFIck27LHcB&state=

注意:code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

第4步:换取网页授权access_token

要拿到认证服务器的授权,大致都需要以下几个信息:

  • client_id 标识第三方应用的id,由认证服务器(微信)在第三方应用提交时颁发给第三方应用

  • client_secret 第三方应用和认证服务器之间的安全凭证,由认证服务器(微信)在第三方应用提交时颁发的

  • code 第3步中认证服务器返回的授权码

  • state 由开发者给出的随机码,可选项

在微信中请求方法为

https:/

当认证服务器拿到上述中的所有信息,验证通过后,会将access_token返回给第三方应用。

注意:由于微信公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

第5步:请求访问用户资源

拿到网页授权验证凭证(access_token)后,剩下的事情就很简单了,资源服务器会提供一系列关于用户资源的API,拿验证凭证(access_token)访问相应的API即可。

例如,在微信中,通过网页授权access_token、openid获取用户信息的请求方法:

//api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

如果网页授权验证凭证(access_token)是正确的,此时资源服务器就会返回资源信息,此时整个OAuth2流程就结束了。

注:本文为Yolo原创,未经许可不得在任何平台转载,侵权必究。如需转载,可关注微信公众号:技术训练营,在后台留言,与作者联系,取得许可才能转载~

微信扫一扫,发现更精彩。

andpods授权码订单号分享_微信OAuth2授权登录相关推荐

  1. andpods授权码订单号分享_不要再让你的接口裸奔了,Boot快速尝试OAuth2密码和授权码模式...

    微服务火热,前后端分离,oauth2 是我们接口调用认证的首选.springboot 天然集成 oauth2,使用非常方便,简单记录下,尝尝鲜. 一.啥是OAuth2 OAuth(开放授权)是一个开放 ...

  2. 微信授权Java重定向前端地址_微信网页授权+分享踩过的坑

    页面用浏览器自带返回和安卓物理返回死循环的话,直接看高潮部分 背景 折磨我两个工作日加周末一天的问题,我觉得还是有必要记录一下,为什么程序员总是加班,就是遇到这些意想不到的问题 需求 领导:我想做两个 ...

  3. 微信公众号开发之微信网页授权获取用户个人信息

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一丶概述 微信网页授权 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑 ...

  4. java 微信二次分享_微信二次分享

    这几天做一个微信公众号的需求,有个分享功能.发现分享从公众号分享到微信是正常的,可以看到缩略图.名称.描述,但是直接转发该分享或者点开该分享再次通过微信分享时,就只出现了链接地址,也没有缩略图.如下图 ...

  5. 微信多订单合并付款_微信小商店订单合并打单,操作分享请收藏!

    同一个同件人和收货地址的多个订单如何合并打单发货呢?如果有多个这种用户下单怎么处理订单打印和发货?目前微信小商店是没有这个合并订单打快递单功能的.这种情况就需要借助第三方打单软件来实现.下面分享微信小 ...

  6. 分享商家为什么要做扫码点餐系统_微信小程序点餐系统有什么作用

    商家为什么要开通"扫码点餐" 解决服务员不够用的问题. 不怕顾客跑单漏单. 在微信就能管理菜品.查看营业额. 订单小票显示顾客桌号和已点菜品. 可在"附近的小程序&quo ...

  7. java调用授权接口oauth2_微信授权就是这个原理,Spring Cloud OAuth2 授权码模式

    上一篇文章Spring Cloud OAuth2 实现单点登录介绍了使用 password 模式进行身份认证和单点登录.本篇介绍 Spring Cloud OAuth2 的另外一种授权模式-授权码模式 ...

  8. java初始化微信分享_微信开发(一)基于Wx-java的微信分享功能

    最近在做微信服务号开发,简单总结一下,便于自己学习积累和分享给大家: 环境介绍: Spring+ Spring MVC +Mybatis 开发语言: JAVA 微信公众平台的开发中,微信只公布了一个基 ...

  9. 公众号 关注_微信公众号关注图文跳转网页如何操作实现?

    对于微信公众号关注图文跳转网页的场景实现,微号帮平台提供了粉丝关注定时推送功能实现,公众平台提供了开发接口编程实现功能效果,都能实现微信公众号关注图文跳转网页,只要网页能正常在个人微信上打开浏览都能设 ...

最新文章

  1. Ubuntu 12.04安装firefox 26中的flash plugin方法
  2. [unreal4入门系列之六] 常用的按键和快捷键
  3. 视频|每日CeBIT:IBM九大展区各显神通,传统工业与工业4.0的博弈
  4. 响应接收窗口大小( ra-ResponseWindowSize)
  5. Runnable、Callable、Executor、Future、FutureTask关系解读
  6. ARM64的启动过程之(五):UEFI
  7. 牛顿法中为何出现hessian矩阵
  8. 你怎么了珍妮,你醒醒啊珍妮~ | 今日最佳
  9. 方向盘的正确驾驭方法
  10. Hakase and Nano【博弈】
  11. IOS 学习笔记 2015-04-15 手势密码(原)
  12. Javascript—③对象
  13. 高性能网关设备及服务实践
  14. Spring mvc 参数类型转换
  15. 带有SeekBar的Android Media Player歌曲
  16. 一个老程序员的一些职场经验分享
  17. Linux用户登录和注销
  18. 跑步时戴什么耳机好、推荐几款专业跑步的耳机
  19. 【国仁网络资讯】视频号密集更新:唤醒的是谁的梦?
  20. 智慧旅游的c端产品破局

热门文章

  1. excel处置4000行数据卡_懂Excel就能轻松入门Python数据分析包pandas(三):制作成绩条...
  2. 14秋《c语言程序设计》作业2,《C语言程序设计》 作业参考答案.doc
  3. jackson 读取多文件_Spring Boot系列之读取配置
  4. python接口自动化关联参数_python接口自动化7-参数关联
  5. 职称计算机技巧集锦,2014职称计算机考试《Excel》使用技巧集锦(4)
  6. Edge浏览器网页怎么收藏 Edge浏览器网页收藏图文教程
  7. 关于js函数未定义not defined引发的感想
  8. tomcat 配置https安全认证协议报错解决方案
  9. 老毛桃U盘快速装系统
  10. Springboot中几个层的功能总结