php实现第三方邮箱登录_JavaScript实现第三方登录网站原理在这呢

点关注,不迷路,每天更新大量前端资料

前端实现第三方登录之OAuth2.0协议

OAuth 2.0 规定了四种获得令牌的流程。我们可以选择最适合自己的那一种,向第三方应用颁发令牌。下面就是这四种授权方式。

  • 授权码模式(authorization-code)
  • 简化模式(implicit)
  • 密码式(password):
  • 客户端凭证(client credentials)

不管哪一种授权方式,第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。

授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。

比如我们经常用某些公众号,用一些论坛,有用QQ,微信登录什么的,需要你在QQ,微信的界面上授权,这些号、论坛就可以拿到你的个人信息,头像什么的,但他们没有你的用户密码。生活中,我去银行办理过代扣水电煤,银行确认我的身份,然后签一个代扣合同,给我回执,之后水电煤公司就直接从我的账户划钱过去了。但公司不知道我的密码,不能代做其它没授权的操作,差不多上OAuth2.0就是解决上面的问题。

OAuth2.0的相同理念的生活场景举例

比如我有银行账户,想授权朋友查看账户金额,不告诉他密码,应该怎么办呢?

我和朋友去银行,银行先后验证我们俩的身份证。银行让我签一个授权合同,上面写着我授权朋友查我的账户,银行给我和朋友各一份合同凭证。银行后台登记朋友拿这个凭证可以查我的账户这样一条信息。之后朋友拿着凭证和他自己的身份证,果然查到了我的账户信息。上面的分析蛮简单的,貌似也没有什么问题。朋友不可能转账,因为银行会查授权合同,我的合同被其它人知道了,别人也不可能查我的账户,因为只授权给朋友。那么把上面的过程转化到应用之中去。我在某论坛上操作,希望用QQ登录。(论坛认为我有QQ号的,论坛本身也在QQ注册过自己的应用的。就如同去银行,这个银行必须可以鉴定我们双方的身份。)

点了QQ登录,那论坛就引导跳转到QQ的授权页面了。(这个过程中,论坛必须提供了自己的登录信息,QQ那边认证了,才出现授权页面。)在这个页面里,我要登录一下QQ了。前面已经认证过论坛了,现在登录就是认证我了。登录成功后,QQ显示出授权的内容,让我确认,我点了确认。(类似银行让我签授权合同了)确认之后,按说是银行将确认了的授权合同,一式三份,给我和论坛各一份。给我看合同并不重要,可以后台存下来,我随时可以登录后,在已授权的地方查看给过的授权信息。关键是怎么给论坛呢?事实上论坛当初转到QQ授权页面的时候,除了提供自己的身份,还有一个redirectUrl。当我点了授权后,QQ把合同给了这个Url,等于就是给了论坛了。论坛拿到了合同,再把自己的登录信息给QQ再验证一下,QQ就把我的资料给了论坛了。如果这里不再验证论坛的身份,论坛把合同卖给其它地方怎么办?那就不安全了!当然我也可能把合同转给其它地方用,来陷害是这个论坛在用。

这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

OAuth认证和授权的过程如下:

1、用户访问第三方网站网站,想对用户存放在服务商的某些资源进行操作。

2、第三方网站向服务商请求一个临时令牌。

3、服务商验证第三方网站的身份后,授予一个临时令牌。

4、第三方网站获得临时令牌后,将用户导向至服务商的授权页面请求用户授权,然后这个过程中将临时令牌和第三方网站的返回地址发送给服务商。

5、用户在服务商的授权页面上输入自己的用户名和密码,授权第三方网站访问所相应的资源。

6、授权成功后,服务商将用户导向第三方网站的返回地址。

7、第三方网站根据临时令牌从服务商那里获取访问令牌。

8、服务商根据令牌和用户的授权情况授予第三方网站访问令牌。

9、第三方网站使用获取到的访问令牌访问存放在服务商的对应的用户资源。

fdb373403cf93b3387aeb1a2da989136.png
1dc82cf7ad8bcf07f4a986058ac12407.png

主要步骤

第一步,A 网站提供一个链接,用户点击后就会跳转到 B 网站,授权用户数据给 A 网站使用。下面就是 A 网站跳转 B 网站的一个示意链接。

https://b.com/oauth/authorize? response_type=code& client_id=CLIENT_ID& redirect_uri=CALLBACK_URL& scope=read

上面 URL 中,response_type参数表示要求返回授权码(code),client_id参数让 B 知道是谁在请求,redirect_uri参数是 B 接受或拒绝请求后的跳转网址,scope参数表示要求的授权范围(这里是只读)。

第二步,用户跳转后,B 网站会要求用户登录,然后询问是否同意给予 A 网站授权。用户表示同意,这时 B 网站就会跳回redirect_uri参数指定的网址。跳转时,会传回一个授权码,就像下面这样。https://a.com/callback?code=AUTHORIZATION_CODE

上面 URL 中,code参数就是授权码。

第三步,A 网站拿到授权码以后,就可以在后端,向 B 网站请求令牌

https://b.com/oauth/token?  client_id=CLIENT_ID& client_secret=CLIENT_SECRET& grant_type=authorization_code& code=AUTHORIZATION_CODE& redirect_uri=CALLBACK_URL

上面 URL 中,client_id参数和client_secret参数用来让 B 确认 A 的身份(client_secret参数是保密的,因此只能在后端发请求),grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码,code参数是上一步拿到的授权码,redirect_uri参数是令牌颁发后的回调网址。

第四步,B 网站收到请求以后,就会颁发令牌。具体做法是向redirect_uri指定的网址,发送一段 JSON 数据

{  "access_token":"ACCESS_TOKEN

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

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

相关文章

mysql计算订单总金额_mysql统计当天消费总额

addtime是时间字段shop是数据表subtotal要统计的字段select * from shop where DATE_FORMAT(addtime,%Y-%m-%d)to_days(now()) group by addtime;$daybeginstrtotime(date(Y-m-d));$dayend$daybegin86400;$sql "select sum(subtotal) as pay from shop where addtime <…

pfx证书密码怎么查询_网站是HTTP?10分钟变成HTTPS!域名免费添加配置SSL证书,变成https//环境...

对于小程序request请求需要https域名、navigator.geolocation定位也需要在https环境下才可以生效等问题&#xff1b;前端开发越来越需要https环境来来测试一下API接口和各类问题&#xff0c;今天来讲解一下怎么免费快速把普通的http网站配置升级成https协议。首先向大家介绍一下…

define定义的是什么类型_为什么Django 3后建议使用Field.choices枚举类型定义choices选项...

Django 3.0的主要新增功能之一是对模型字段选择的枚举。它是一种定义和约束模型Field.choices的更好方法。以前在Django模型中通常会通过定义一些“常量”和元组来定义choices&#xff0c;如下所示&#xff1a;from django.db import modelsclass Book(models.Model):UNPUBLISH…

linux卸载openjdk_Linux系列(七)——linux其他指令【rpm、yum、sudo】

1、rpm和yum1.1、介绍rpm: rpm 是由 Red Hat 公司开发的一种软件包管理方式&#xff0c;使用 rpm 我们可以方便的进行软件的安装、查询、卸载等工作&#xff0c;但是使用 rpm 命令安装 rpm 软件包&#xff0c;不能自己解决软件包之间的依赖性问题&#xff0c;需要自己一个一个去…

mysql 为数据表添加字段_MySQL数据表添加字段实例

MySQL 允许在开头、中间和结尾处添加字段。针对不同的位置&#xff0c;MySQL数据表添加字段的方式也有所不同&#xff0c;下面我们一起来看MySQL数据表添加字段的实例&#xff0c;方便我们理解MySQL数据表添加字段的方式。MySQL数据表添加字段分为开头、 中间和末尾三种情况&am…

postgresql 客户端_一款功能强大的数据库客户端:DataGrip

前言在我们日常的程序开发中&#xff0c;很大一部分时间是在与数据库打交道。查数据&#xff0c;导数据&#xff0c;检查SQL执行计划&#xff0c;优化SQL等&#xff0c;是我们数据库开发工作的重要组成部分&#xff0c;而且很多时候我们会使用到多款数据库&#xff0c;如Oracle…

mysql主从同步报错_mysql主从同步报错

主从不同步&#xff0c;经查看发现如下报错Last_Errno: 1666​Last_Error: Error executing row event: Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT STATEMENT.问题原因&#xff1a;主从复制&#xff…

java 等待几秒_问懵逼:请站在 JVM 角度谈谈 Java 的锁?

存在的问题自旋锁自适应自旋Java 对象的内存布局(重要)synchronized 锁升级流程偏向锁轻量级锁重量级锁可重入悲观锁(互斥锁、排他锁)《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解…

python定义test方法_向python/django失败的测试方法的详细信息中添加自定义/调试消息的任何方法unittest.TestCase?...

通常&#xff0c;您希望从django的unittest类TestCase继承&#xff0c;可以从django.测试. 也就是说&#xff0c;您可以将msg参数传递给您要评估的任何内容&#xff0c;其中包含失败消息。在以下是“人性化”的一个例子&#xff1a;class HumanizeTests(TestCase):def humanize…

mysql 创建新用户权限_MySQL创建新用户以及权限授予

1.通过mysql数据库的user表查看用户相关信息mysql> use mysql;mysql> select host,user from user;查看用户相关信息2.创建数据库mysql> create database [databasename] default character set utf8 collate utf8_general_ci;3.创建新用户mysql> create user user…

中秋祝福网页_中秋客户维系关怀,该送客户什么礼品?

企业节日礼品是企业间或者商务伙伴之间相互传达美好情意的一种体现&#xff0c;无论是送领导、送员工、还是送合作伙伴&#xff0c;礼品定制都需要根据不同赠送对象来细心选择。如果想要礼品有创意同时又能表达企业理念&#xff0c;进而达到宣传推广或者品牌认知提升的效果&…

ubuntu php mysql5.6_Ubuntu16.04搭建php5.6Web服务器环境

Ubuntu 16.04默认安装php7.0环境&#xff0c;但是php7目前对某些旧系统的兼容性并不是很好&#xff0c;如果自行安装php5需要清除php7的已安装包&#xff0c;否则会报错。移除默认及已安装的PHP包sudo dpkg -l | grep php| awk {print $2} |tr "\n" " "sud…

浏览器svg插件_Archer-svgs: 异步加载svg方案

Github地址&#xff1a; ShanaMaid/archer-svgs哇哦!无限的svgs!你可以使用archer-svgs去异步加载svg并将它缓存在localStorage里&#xff0c;当你再次使用已经加载过的svg时将不需要再发起http请求。将svgs从你的js-bunlde里移除&#xff0c;并且永远减小js-bunlde的体积。&am…

php打开网页执行即执行bat程序_CVE202011107:XAMPP任意命令执行漏洞复现

0x00简介XAMPP是一个把Apache网页服务器与PHP、Perl及MariaDB集合在一起的安裝包&#xff0c;允许用戶可以在自己的电脑上轻易的建立网页服务器。该软件与phpstudy类似。2020年4月1日ApacheFriends官方发布了XAMPP新版本&#xff0c;该更新解决了Windows Platforms CVE-2020-11…

阿里云rocketmq_云原生时代消息中间件的演进路线

作者 | 周礼&#xff08;不铭&#xff09; 阿里巴巴集团消息中间件架构师导读&#xff1a;本文整理自作者于 2020 年云原生微服务大会上的分享《云原生时代的消息中间件演进》&#xff0c;主要探讨了传统的消息中间件如何持续进化为云原生的消息服务。关注阿里巴巴云原生公众号…

mongodb mysql配置_Nosql_MongoDB数据库配置以及基本指令

数据库(database)-数据库的服务器-服务器用来保存数据-mongod用来启动服务器-数据库的客户端-客户端用来操作服务器&#xff0c;对数据进行增删改查的操作-mongo用来启动客户端(不能关闭启动的服务器&#xff0c;否则新开的客户端无法连接)扩展&#xff1a;将mongodb设置为系统…

python的pygame库使用方法_python基础教程使用Python第三方库pygame写个贪吃蛇小游戏...

今天看到几个关于pygame模块的博客和视频&#xff0c;感觉非常有趣&#xff0c;这里照猫画虎写了一个贪吃蛇小游戏&#xff0c;目前还有待完善&#xff0c;但是基本游戏功能已经实现&#xff0c;下面是代码&#xff1a;# 导入模块import pygameimport random# 初始化pygame.ini…

mysql爱吃鱼油_鱼油or磷虾油,多油饮食的国人心血管健康如何拯救?

作为美食大国&#xff0c;高油重口的饮食生活习惯直接导致我国心血管病患病率处于逐年上升的阶段&#xff0c;据统计我国现有心血管病患者已达3.3亿人&#xff0c;占总人口的40%以上。许多年轻人心血管健康已经呈现过度损害状况&#xff0c;心血管疾病也不再是中老年专利。因此…

python如何实现选项功能_python几种常用功能如何实现 python几种常用功能实现代码实例...

本篇文章小编给大家分享一下python几种常用功能实现代码实例&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家供大家参考&#xff0c;有需要的小伙伴们可以来看看。1、python 程序退出的几种方式import syssys.exit()sys.exit(0)sys.exit(1)或者os._exit()该方法中包含…

小程序promise封装post请求_Promise封装微信小程序的Request请求

回调地狱一向是影响开发和维护的症结所在&#xff0c;无数个success()的嵌套再嵌套&#xff0c;导致代码层级颇深&#xff0c;盘一次逻辑都要费劲千辛万苦&#xff0c;ES6语法中的Promise&#xff0c;便是专为解决JS中异步请求回调的信任问题而存在的&#xff0c;结合小程序目前…