智享系列之一个套路学会所有的第三方登录

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80859088 很多网站在刚刚起步的时候都会使用第三方登录来吸引流量。
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80859088


很多网站在刚刚起步的时候都会使用第三方登录来吸引流量。当然,其中也包括我。我的 网站上现在是接入了QQ、新浪微博、码云和百度的第三方登录功能.接入这些功能时我发现了一些规律,在这里分享给大家,大家需要接入的话看这一篇文章就可以了。

首先,第一步,也是不得不做的,进入你要接入的开放平台申请账号、填写资料等待审核等。填写资料的时候需要注意的地方是回调地址,这个回调地址就是用户在第三方平台登陆成功以后返回到你的程序的页面。以我的网站为例,我的回调地址就是个人中心,也就是说用户登陆后会进入个人中心页面。(在这里小小的吐槽一下wx,想要接入还得进行开发者认证,人民币300元,不知道为了啥)。


审核通过以后平台会给我们分配一个client_id和一个client_secret,请妥善保管,非常重要。接下来我们进入正题,先放一张图:


不了解UML的同学请先参照这篇文章 :几分钟几张图教你学会如何使用UML

上面这张我所精心绘画的流程图呢就是本篇博客的所有内容的核心了,所有的第三方登录几乎都是围绕着这么一个套路来进行的。

咱们来按着上方流程图来一步一步的入坑吧(我会同时附上四种登录方式)

  1. 在页面上放置登录按钮,类似于这种:点击按钮的时候分别调用下列方法打开第三方登录地址
window.open("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101453375&redirect_uri=http://zhixiang.org.cn/%23/qqLogin&state=1", '_self');

window.open("https://api.weibo.com/oauth2/authorize?client_id=3191489564&response_type=code&redirect_uri=http://zhixiang.org.cn/%23/login", '_self');

window.open("https://gitee.com/oauth/authorize?client_id=d69717952196dad2c1f2930e014230f75c1326bc98b3cb90e6dd36d4fb5d00ba&redirect_uri=http%3A%2F%2Fzhixiang.org.cn%2F%23%2FgiteeLogin&response_type=code", '_self');

window.open("http://openapi.baidu.com/oauth/2.0/authorize?client_id=rwjHEoVuPyxrgGOBwuyLEs5G&redirect_uri=http%3A%2F%2Fzhixiang.org.cn%2F%23%2FbaiduLogin&response_type=code", '_self');


相信聪明的你看域名的话就可以看出来上方分别调用的是什么了。这里主要讲一下上方url中的几个参数。response_type=code:这个是固定值,不用管。client_id:这个值就是你审核通过以后获得的client_id,是第三方用来区分你的应用程序的唯一标示,redirect_uri:这个就是回调地址了,用户在第三方登录以后会携带着登录结果值访问回调地址。


2.用户登录成功第三方调用回调地址,回调我们的url大概为这种(http://qq.com?code=*****),我们在第三方回调我们时获取这个code的参数。接下来使用code参数来访问第三方去获取用户token,我们需要分别拼接出以下url:

https://api.weibo.com/oauth2/access_token?client_id=****&client_secret=*****&grant_type=authorization_code&redirect_uri=******&code=*******
https://gitee.com/oauth/token?grant_type=authorization_code&code=*******client_id=****&redirect_uri=********&client_secret=*****
https://graph.qq.com/oauth2.0/token?client_id=****&client_secret=*****&grant_type=authorization_code&redirect_uri=******&code=*******
https://openapi.baidu.com/oauth/2.0/token?client_id=****&client_secret=*****&grant_type=authorization_code&redirect_uri=******&code=*******

看了上方的url是不是已经发现了我说的为什么这些第三方登录都是一个套路了吧,这里所有的grant_type都是固定值,clien_id不用说,client_secret同样也是第三方给我们的,相信你不会陌生,redirect也不用说。紧接着就是发送Http请求了。这里码云的会有一个坑,在发送请求时必须携带一个header (User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

)不信的话可以试一试哦,如何在服务器发送http请求可以参考我的另一篇文章:Java工具类之在服务器发送HTTP请求 


3.上述请求发送以后我们可以把返回结果转换为json对象,紧接着如果你在此json对象中获取一个key为access_token的值(同时,新浪微博要多获取一个uid字段)那么就代表你离成功又近了一步。你问我要是没有怎么办,没有请debug返回结果并参考各平台错误码确认。现在我认为你已经成功取到了token。

4.如果你是使用的第三方登录不是QQ的话请忽略这一步,QQ请先使用access_token访问下面这个地址获取一个openId

https://graph.qq.com/oauth2.0/me?access_token=*********

5.现在已经走到了最后一步了。继续http请求:

https://api.weibo.com/2/users/show.json?access_token=*******&uid=********
https://gitee.com/api/v5/user?access_token=*******
https://openapi.baidu.com/rest/2.0/passport/users/getInfo?access_token=*******
https://graph.qq.com/user/get_user_info?access_token=*******&oauth_consumer_key=*********&openid=*******

上方我们唯一陌生的可能是QQ的oauth_consumer_key字段了,其实不陌生,他就是你的client_id.请求发送完毕以后就可以得到用户信息了,

参照平台的字段对应的意义我们选取需要的就可以了。(这里放一下百度的和微博的)


很多网站在刚刚起步的时候都会使用第三方登录来吸引流量。当然,其中也包括我。我的 网站上现在是接入了QQ、新浪微博、码云和百度的第三方登录功能.接入这些功能时我发现了一些规律,在这里分享给大家,大家需要接入的话看这一篇文章就可以了。

首先,第一步,也是不得不做的,进入你要接入的开放平台申请账号、填写资料等待审核等。填写资料的时候需要注意的地方是回调地址,这个回调地址就是用户在第三方平台登陆成功以后返回到你的程序的页面。以我的网站为例,我的回调地址就是个人中心,也就是说用户登陆后会进入个人中心页面。(在这里小小的吐槽一下wx,想要接入还得进行开发者认证,人民币300元,不知道为了啥)。


审核通过以后平台会给我们分配一个client_id和一个client_secret,请妥善保管,非常重要。接下来我们进入正题,先放一张图:


不了解UML的同学请先参照这篇文章 :几分钟几张图教你学会如何使用UML

上面这张我所精心绘画的流程图呢就是本篇博客的所有内容的核心了,所有的第三方登录几乎都是围绕着这么一个套路来进行的。

咱们来按着上方流程图来一步一步的入坑吧(我会同时附上四种登录方式)

  1. 在页面上放置登录按钮,类似于这种:点击按钮的时候分别调用下列方法打开第三方登录地址
window.open("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101453375&redirect_uri=http://zhixiang.org.cn/%23/qqLogin&state=1", '_self');

window.open("https://api.weibo.com/oauth2/authorize?client_id=3191489564&response_type=code&redirect_uri=http://zhixiang.org.cn/%23/login", '_self');

window.open("https://gitee.com/oauth/authorize?client_id=d69717952196dad2c1f2930e014230f75c1326bc98b3cb90e6dd36d4fb5d00ba&redirect_uri=http%3A%2F%2Fzhixiang.org.cn%2F%23%2FgiteeLogin&response_type=code", '_self');

window.open("http://openapi.baidu.com/oauth/2.0/authorize?client_id=rwjHEoVuPyxrgGOBwuyLEs5G&redirect_uri=http%3A%2F%2Fzhixiang.org.cn%2F%23%2FbaiduLogin&response_type=code", '_self');


相信聪明的你看域名的话就可以看出来上方分别调用的是什么了。这里主要讲一下上方url中的几个参数。response_type=code:这个是固定值,不用管。client_id:这个值就是你审核通过以后获得的client_id,是第三方用来区分你的应用程序的唯一标示,redirect_uri:这个就是回调地址了,用户在第三方登录以后会携带着登录结果值访问回调地址。


2.用户登录成功第三方调用回调地址,回调我们的url大概为这种(http://qq.com?code=*****),我们在第三方回调我们时获取这个code的参数。接下来使用code参数来访问第三方去获取用户token,我们需要分别拼接出以下url:

https://api.weibo.com/oauth2/access_token?client_id=****&client_secret=*****&grant_type=authorization_code&redirect_uri=******&code=*******
https://gitee.com/oauth/token?grant_type=authorization_code&code=*******client_id=****&redirect_uri=********&client_secret=*****
https://graph.qq.com/oauth2.0/token?client_id=****&client_secret=*****&grant_type=authorization_code&redirect_uri=******&code=*******
https://openapi.baidu.com/oauth/2.0/token?client_id=****&client_secret=*****&grant_type=authorization_code&redirect_uri=******&code=*******

看了上方的url是不是已经发现了我说的为什么这些第三方登录都是一个套路了吧,这里所有的grant_type都是固定值,clien_id不用说,client_secret同样也是第三方给我们的,相信你不会陌生,redirect也不用说。紧接着就是发送Http请求了。这里码云的会有一个坑,在发送请求时必须携带一个header (User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

)不信的话可以试一试哦,如何在服务器发送http请求可以参考我的另一篇文章:Java工具类之在服务器发送HTTP请求 


3.上述请求发送以后我们可以把返回结果转换为json对象,紧接着如果你在此json对象中获取一个key为access_token的值(同时,新浪微博要多获取一个uid字段)那么就代表你离成功又近了一步。你问我要是没有怎么办,没有请debug返回结果并参考各平台错误码确认。现在我认为你已经成功取到了token。

4.如果你是使用的第三方登录不是QQ的话请忽略这一步,QQ请先使用access_token访问下面这个地址获取一个openId

https://graph.qq.com/oauth2.0/me?access_token=*********

5.现在已经走到了最后一步了。继续http请求:

https://api.weibo.com/2/users/show.json?access_token=*******&uid=********
https://gitee.com/api/v5/user?access_token=*******
https://openapi.baidu.com/rest/2.0/passport/users/getInfo?access_token=*******
https://graph.qq.com/user/get_user_info?access_token=*******&oauth_consumer_key=*********&openid=*******

上方我们唯一陌生的可能是QQ的oauth_consumer_key字段了,其实不陌生,他就是你的client_id.请求发送完毕以后就可以得到用户信息了,

参照平台的字段对应的意义我们选取需要的就可以了。(这里放一下百度的和微博的)


相关文章
|
29天前
|
安全 算法 API
产品经理必备知识——API接口
前言 在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶等等,背后都离不开我们今天要聊的API接口。
|
移动开发 缓存 监控
面试官:本机号码一键登录,是怎么实现的?
面试官:本机号码一键登录,是怎么实现的?
1066 0
面试官:本机号码一键登录,是怎么实现的?
|
6月前
|
XML 安全 JavaScript
当面试官突然提到第三方登录时,我不禁微笑了~ 探秘WeChat公众号扫码关注登录!
当面试官突然提到第三方登录时,我不禁微笑了~ 探秘WeChat公众号扫码关注登录!
38 0
当面试官突然提到第三方登录时,我不禁微笑了~ 探秘WeChat公众号扫码关注登录!
|
9月前
|
移动开发 安全 JavaScript
一图搞懂扫码登录的技术原理
一图搞懂扫码登录的技术原理
188 0
|
10月前
|
存储 算法 Java
谈一谈API接口开发
谈一谈API接口开发
|
11月前
|
小程序 容器
如何做一个微信答题小程序(二)
嗨!大家好,我是小蚂蚁。在上一节里,我们了解了如何设计答题小程序中的题库——表格,并且知道了如何从题库中随机抽取指定数量的不重复的题目编号。这一节,我们将分享一下如何利用这些题目编号,获取到指定的题目信息,然后将题目呈现出来。 在上一节中我们将随机抽取到的不重复的题目编号记录在了一个“随机选题列表”中。接下来,我们将从列表中挨个取出题目编号,然后显示出当前的题目。
96 0
|
11月前
|
小程序
如何做一个微信答题小程序(一)
今天我们就从题库表格的设计开始,分享一下如何设计一个答题小程序的表格,以及如何从题库中随机的抽取指定数量的题目。 单选题库表格设计 对于一个答题小程序来讲,最合适当作题库的数据形式当然要属表格了。表格适合用于数据的组织和管理,对于单选题库来讲,我们使用如下的数据表格。
195 0
|
11月前
|
小程序
如何做一个微信答题小程序(四)
嗨!大家好,我是小蚂蚁。这一节里,我们继续分享如何在答完题后进行答案的比对,以及如何实现一个回顾功能。 在上一节里我们提到过,为了记录玩家的答题数据,我们创建了一个新的表格——玩家答题选项表,里面记录的是玩家回答的题目编号,以及对应的答案。当所有的题目都回答完毕,玩家选择提交后,其实我们要做的,就是逐个的将“玩家答题选项表”中的数据与题库中的答案数据进行比对,来检查题目是答对还是答错。 因为题目中包含着单选题和多选题,所以针对不同的题型,需要做不同的判断处理。
90 0
|
11月前
|
小程序
如何做一个微信答题小程序(三)
嗨!大家好,我是小蚂蚁。今天我们来分享一下如何实现答题功能,包含单选题和多选题的答题,以及如何记录玩家的答题数据。 单选题答题处理 对于单选题来讲,每个选项之间是互斥的,也就是说用户只能从 ABCD 的四个选项中选择一个,不可能同时选择多个。所以在处理单选题答题时,当用户选择了 A 然后又切换到 B 时,此时“选项B”应该是被选中状态,而“选项A”应该是未被选中状态。
209 0
|
JSON Java 数据格式
java实现微信第三方登录流程源码详解,所遇到的坑
java实现微信第三方登录流程源码详解,所遇到的坑
540 0
java实现微信第三方登录流程源码详解,所遇到的坑