前期准备
1、首先开发者需要登录QQ互联,进行开发者认证,这里需要
个人基本信息一张手持身份证的张片2、进入应用管理页面,依次点击:应用管理 -> 网站应用 -> 创建应用,应用信息提交后,等待审核通过即可,这一步我们需要注意的是:
网站域名需要提前备案网站信息要和备案信息一致QQ登录实现
这里为了简单,我们使用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对象的时候,必须是单例,也就是说,必须保证生成登录地址的对象的执行登录方法的对象是同一个。