php实现第三方登录

php实现第三方登录

1. oAuth2.0原理

网站为了方便用户快速的登录系统,都会提供使用知名的第三方平台账号进行快速登录的功能,第三方登录都是基于oAuth2.0标准来实现的。下面详细分析【基于账号密码授权】和【基于oAuth2.0标准授权】的原理和oAuth2.0授权的优点。

1.1 账号密码授权方式

php实现第三方登录

用户到网站发起使用其他平台账号登录的指令,第三方平台网站就向用户索取账号和密码,用户将账号和密码提供第三方网站之后,网站使用用户提供的账号和密码去登录服务商,取回用户的信息。这就是使用账号和密码授权登录的流程。

存在的问题:

一、服务商的账号和密码都泄漏给了第三方平台,导致安全性问题;

分析:假设服务商是微信,没有人会愿意把微信账号和密码告诉当前访问的网站,一旦当前网站发生信息泄漏,微信账号和密码都会丢失;

二、用户要收回授权,只能通过修改密码来实现,若是有多个第三方网站都是用

同一个服务商授权登录,那么所有第三方网站的授权都被收回来了;

分析:假设我们想要收回授权给当前网站的账号和密码,又不可能让第三方主动放弃已给

授权,那么只有用户自己修改微信密码,但是有多个第三方网站都被微信服务商授权了登录,修改密码的同时,其它网站的授权也都失效了;

三、很难实现给不同的网站,授予不同的权限;

1.2 oAuth原理和授权流程

为了解决上述传统的账号密码授权方式存在的问题,oAuth项目组制定了oAuth标准,目的在于为API访问授权提供一个开放的标准;oAuth是针对访问授权的一个开放标准,与以往的授权方式不同之处是oAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此oAuth是安全的。oAuth是Open Authorization的简写。服务商和第三方平台依据oAuth标准来编码,服务商可以实现一个安全的授权机制,第三方应用调用服务商资源也有了统一性,服务商和第三方依据统一的标准来实现自己的功能。

php实现第三方登录

用户向第三方网站发起请求,请求使用其它平台授权登录,这个时候第三网站并不是直接的要求用户提供其它平台的账号和密码,而是引导用户浏览器跳转到服务商的授权登录页面,用户在服务商的网站页面进行登录完成授权。所以解决了刚才的第一个问题,用户不需要给第三方用户透露账号和密码。登录授权之后,服务商就会生成一个一次性的用来访问资源的访问码,我们叫做令牌,这个令牌包含了用户、第三方网站、资源权限的信息。生成这个令牌之后,服务商又引导用户浏览器携带这个令牌跳回第三方网站的页面,网站接收这个令牌后,第三方网站就可以携带令牌作为凭证访问服务商上面有权限访问的资源。在这个过程中,用户没有泄漏账号和密码给第三方,成功授权登录,并且限制了第三方访问的服务资源的权限。

下面是oAuth2.0授权流程图

php实现第三方登录

2. php实现微信授权登录

在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。 

微信接入流程

第三方登录

第一步:请求CODE

https://open.weixin.qq.com/connect/qrconnect?appid=wxd7ygg9f86e0e&redirect_uri=http://www.rainzfw.tech/third-login/weixin.html&response_type=code&scope=snsapi_login&state=123

若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。

php技术

微信二维码

用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数

http://www.rainzfw.tech/third-login/weixin.html?code=bckbjhbjhvbvjaf43415&state=123

第二步:通过code获取access_token

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

php技术

返回说明:

{

    “access_token”: “OezXcEiiBSKSxW0eoylIeFy2HFC4Bxv9JvC0Sgj4Px4_8TX1ci3jF_QP_6sWjvx2rCAUjXEP1_9edZdJLf3MIwii2N8cnTooDfx7nYpFRmOSZyq4gb2FNdWJr__KUqPtcfVUvg6XBTucZZ4zH6v8VQ”,

    “expires_in”: 7200,

    “refresh_token”: “OezXcEiiBSKSxW0eoylIeFy2HFC4Bxv9JvC0Sgj4Px4_8TX1ci3jF_QP_6sWjvx2lW60INlf6AK1q21rW7mJyc5yG3GZ9p1psANOKTi2EZUQXA6CnwSXxDQlJ3421tEOvCWIrJhkA8oTqjsLKYG-yg”,

    “openid”: “oJekJs2faTQ47FGjDOEIyOPMN97s”,

    “scope”: “snsapi_login”,

    “unionid”: “o4wcnw02YjFUYglZxV0LwcBkVF6Y”

}

php培训

第三步:通过access_token调用接口:

1. access_token有效且未超时;

2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

对于接口作用域(scope),能调用的接口有以下:

接口作用域

其中snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。接口调用方法可查阅《微信授权关系接口调用指南》

https://blog.csdn.net/villainy13579/article/details/70231191

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/113047.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 数据库课程设计(饭店点餐系统)

    数据库课程设计(饭店点餐系统)1.需求分析2.概念结构设计2.1数据需求2.1.1下订单阶段需要的数据:2.1.2点菜阶段需要的数据:2.1.3结账阶段需要的数据:2.1.4员工管理需要的数据:2.1.5顾客管理需要的数据:2.1.6消费记录管理需要的数据有:2.2事务需求2.2.1数据录入2.2.2数据更新/删除2.2.3数据查询2.3数据项2.2抽象出系统的实体2.3设计E-R图2.3.1菜谱(Menus)E-R图2.3.2顾客(Tomer)E…

  • 汉字转16进制java_java实现汉字转unicode与汉字转16进制实例[通俗易懂]

    汉字转16进制java_java实现汉字转unicode与汉字转16进制实例[通俗易懂]本文实例讲述了java实现汉字转unicode与汉字转16进制的实现方法。分享给大家供大家参考。具体实现方法如下:一、汉字转unicodepublicstaticStringtoUnicode(Strings){Stringas[]=newString[s.length()];Strings1=””;for(inti=0;i<s.length();i++…

    2022年10月31日
  • java取整四舍五入_java取整和四舍五入

    java取整四舍五入_java取整和四舍五入Contents12345Math类里的两个方法:staticdouble(doublea)返回最大的(最接近正无穷大)double值,该值小于等于参数,并等于某个整数。staticdoubleceil(doublea)返回最小的(最接近负无穷大)double值,该值大于等于参数,并等于某个整数。123456789101112131415161718192021222324252627…

  • 软件测试的基本理论知识_软件测试基础知识整理

    软件测试的基本理论知识_软件测试基础知识整理01软件研发流程1.软件产品软件产品是指向用户提供的计算机软件、信息系统或设备中嵌入的软件或在提供计算机信息系统集成、应用服务等技术服务时提供的计算机软件。2.软件工程软件工程,英文名SoftwareEngineering,是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。“软件工程是开发、运行、维护和修复软件的系统方法。”这个定义相当概括,它主要强调软件工程是系统方法而不是某种…

    2022年10月25日
  • 编程helloworld代码_pycharm怎么编写python代码

    编程helloworld代码_pycharm怎么编写python代码1.什么是Pycharm?PyCharm是一种PythonIDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。能够帮助我们在编写代码时提高效率。2.下载Pycharm网上提供的有专业版和教育版之分(windows下的)。网址:https://www.jetbrains.com/pycharm/download/#section=windows·专业版是收费的,功能更全面…

  • 0.九九乘法表[递归]

    0.九九乘法表[递归]

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号