前言
这一篇我们主要来说一下如何使用JavaSdk 和 Js Sdk 来实现我们的第三方登录
本地测试记得修改本地的hosts文件哦 修改127.0.01 映射为 您的域名地址即可 因为http请求会先解析本地的 DNS 在去互联网上解析 所以想在本地测试就需要修改hosts文件
位置在 C:/Windows/System 32/drivers/etc/hosts
域名设置在下面教程
开始
首先我们要借助于开放平台提供的力量来进行开发 那么我们是否是有必要去了解一下开放平台所尊徐的协议呢 没错 互联网中这么多的开放平台都是实现了oAuth2规范协议
那么这个oAuth是什么呢?
首先我们需要知道 oAuth 是一种标准 对应的实现有Spring Security oAuth2 框架 或者说 Shiro 框架对其都有实现
先来看起执行流程
里面有几种角色 分别是
资源所有者 就是用户
资源服务器 提供资源的服务器 不用太关系 站在用的角度
第三方应用客户端 我们的程序
授权服务器 也可以叫认证服务器 QQ开放平台的认证服务器 我们不用太关心
配合上图再看一遍
我们今天主要来说一下QQ登录的流程以及实现
其中主要的标识有
code
access_token
openid
再次看一张流程图
借用官方的流程图样例
我们需要分别拿到code 通过code 得到 access_token 在通过access_token 获取 用户唯一对外开放标识 openid
在此之前 我们需要去开放平台中注册用户 设置我们的应用得到appid 和 appkey
我们一步一步来
第一步
第二步
进行登录
第三步
第四步
第五步
选择您的应用类型 我这里以网站应用为准
第六步
填写您对应的信息
第七步
设置您的应用信息
注意
网站地址必须是外网可以访问的 因为回调地址会在qq后台的服务器发送的 所以外网不能访问那是不行的
回调地址你可以写以网站域名/xxx都行
例如 域名是 http://liwenxiang.top 回调地址就可以是 http://liwenxiang.top/qqlogin
创建成功
点击应用管理
可以看到你刚刚申请的应用在审核中 等待审核通过即可
查看appid 和 app key 这个应用我已经删除了哦 不要做坏事哦 嘿嘿
查看接口就选择另一个选项卡即可
以上准备工作做完之后我们来看 具体的内容
先了解几个标识的意思
code 就是用来获取access_token的 通过请求 https://graph.qq.com/oauth2.0/authorize 获得 请求方式是get方式 code会在10分钟内过期
请求的参数如下 这些都是官网有的 在这里大致说一下
response_type 必须 授权类型,此值固定为“code”。
client_id 必须 申请QQ登录成功后,分配给应用的appid。
redirect_uri 必须 成功授权后的回调地址,必须是注册appid时填写的主域名下的地址,建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
state 必须 client端的状态值。用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
scope 可选 请求用户授权时向用户显示的可进行授权的列表。
可填写的值是API文档中列出的接口,以及一些动作型的授权(目前仅有:do_like),如果要填写多个接口名称,请用逗号隔开。
例如:scope=get_user_info,list_album,upload_pic,do_like
不传则默认请求对接口get_user_info进行授权。建议控制授权项的数量,只传入必要的接口名称,因为授权项越多,用户越可能拒绝进行任何授权。
display 可选 仅PC网站接入时使用。
用于展示的样式。不传则默认展示为PC下的样式。
如果传入“mobile”,则展示为mobile端下的样式。
获取access_token
获取access_token的话也有对应的地址请求 其实就是去请求qq的认证服务器去了
这个也有过期时间 官网说的是三个月
地址 https://graph.qq.com/oauth2.0/token
在写在之后我们使用JavaSDK的时候 都是已经封装好的 用起来很方便
请求地址成功后 会返回到您的回调地址 并携带这么一串查询字符串
access_token=FE04************************CCE2&expires_in=7776000&refresh_token=88E4************************BE14
获取openid 用户身份标识
请求地址 https://graph.qq.com/oauth2.0/me
然后就是我们需要知道这几个标识分别是什么意思 要谨记哦
开发
链接:https://pan.baidu.com/s/1zv6-4zSGMqCjG44FrK-tjg
提取码:ja3d
请务必下载DEMO哦 里面有JavaSDK jssdk采用CDN的
请必看README.txt !!! 请必看README.txt !!! 请必看README.txt!!!
写代码前说的话
在实际应用中 我们肯定是有对应的数据库的 所以数据库的设计是必不可少的 因为我们的用户在使用QQ登陆之后我们是需要给存储到数据库中的 做一些绑定操作等等 所以说一个合理的数据库设计是很重要的 以下就是简单的数据库结构 但是改DEMO中并没有将用户存储到数据库中 其实我们仅仅讲到获取到openid就OK了 获取到了openid你还不会存储到数据库中吗 这都是比较简单的了对吧 我们要关注核心
字段名 字段含义
id 主键
openType 第三方类型,比如qq、weibo
openId 代表用户唯一身份的ID
expiredTime 授权过期时间,第三方登录授权都是有过期时间的,比如3个月
nickname 昵称
avatar 头像
Java 方式实现 第三方登录
首先我们创建一个SpringBoot项目 目录结构就是改例子DEMO一样 还有文件
我来解释一下里面的内容意思
qqlogin依赖是手动导入进去的 就是说是自己手动打到maven仓库中
对应命令
mvn install:install-file -DgroupId=tx.qqsdk -DartifactId=qqlogin -Dversion=1.1 -Dfile=你的sdk jar路径 -Dpackaging=jar
pom.xml
里面模板引擎的依赖thymeleaf 是因为我们用到了模板引擎
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>top.liwenxiang.qqlogin</groupId>
<artifactId>qqlogin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>qqlogin</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
<dependency>
<groupId>tx.qqsdk