1、首先开发者需要登录QQ互联,进行开发者认证,这里需要
- 个人基本信息
- 一张手持身份证的张片
2、进入应用管理页面,依次点击:应用管理 -> 网站应用 -> 创建应用,应用信息提交后,等待审核通过即可,这一步我们需要注意的是:
- 网站域名需要提前备案
- 网站信息要和备案信息一致
这里为了简单,我们使用JustAuth来实现QQ登录,该项目集成了Github、Gitee、QQ、微博等等第三方登录,号称史上最全的整合第三方登录的开源库。
另外为了方便演示,就不使用SpringBoot了,只用Vert.x搭建简单的服务。
1、导入依赖,其中hutool是一个工具类库
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>me.zhyd.oauth</groupId>
<artifactId>JustAuth</artifactId>
<version>1.15.2-alpha</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
<version>3.2.0</version>
</dependency>
2、实现服务端代码
packagecom.qianyu;
importcn.hutool.json.*;
importio.vertx.core.*;
importio.vertx.core.http.*;
importio.vertx.ext.web.*;
importme.zhyd.oauth.config.*;
importme.zhyd.oauth.model.*;
importme.zhyd.oauth.request.*;
importme.zhyd.oauth.utils.*;
publicclassServer{
privatestaticAuthQqRequestauthQqRequest;
privatestaticAuthRequestcreateAuthRequest(){
if(authQqRequest==null){
authQqRequest=newAuthQqRequest(AuthConfig.builder()
.clientId("你的clientid")
.clientSecret("你的clientsecret")
.redirectUri("你的回调地址")
.build());
}
returnauthQqRequest;
}
publicstaticvoidmain(String[]args){
Vertxvertx=Vertx.vertx();
Routerrouter=Router.router(vertx);
router.get("/comm/user/callback").blockingHandler(context->{
HttpServerRequestreq=context.request();
AuthCallbackcallback=newAuthCallback();
callback.setCode(req.getParam("code"););
callback.setstate(req.getParam("state"));
AuthRequestauthRequest=createAuthRequest();
AuthResponseauRes=authRequest.login(callback);
HttpServerResponseres=context.response();
res.putHeader("Content-Type","text/json;charset=utf-8");
res.end(JSONUtil.toJsonStr(auRes));
});
router.get("/login").blockingHandler(context->{
Stringurl=createAuthRequest().authorize(AuthStateUtils.createState());
HttpServerResponseres=context.response();
res.putHeader("location",url);
res.setStatusCode(302);
res.end();
});
HttpServerhttpServer=vertx.createHttpServer();
httpServer.requestHandler(router::accept);
httpServer.listen(8886);
}
}
代码很好理解,主要可以分为以下几个步骤
- 构建一个QQ登录的工具类,监听两个路由
- 当我们访问/login的时候,生成登录地址,并且重定向到登录地址
- 当我们登录之后,系统跳往回调地址,即/comm/user/callback,在这里我们获取参数code和state封装成AuthCallback对象,执行登录方法
- 登录成功后会返回用户信息,格式如下:
登录成功后返回的用户信息
需要注意的是:创建AuthQqRequest对象的时候,必须是单例,也就是说,必须保证生成登录地址的对象的执行登录方法的对象是同一个。