前言难度:简单背景最近在写闪调,想接受第三方授权登录,比如微信的扫码登录。Qq、github、钉钉等授权登录,你一定在第三方网站上用过其中之一。它是基于OAuth2.0协议标准设计的。如果你接管了一个家庭,你会发现其他人也一样。为了理清逻辑,我们以微信的整体流程为例。1、第三方发起微信授权登录请求。微信用户允许第三方应用授权后,微信会启动应用或重定向到第三方网站,并带上授权临时票码参数;2、添加AppID和AppSecret等,通过API交换access_token;3、使用access_token进行接口调用,获取用户基础数据资源或帮助用户实现基础操作。上一张官图1、跳转到第三方授权页面。首先,用户必须点击跳转到一个页面来操作授权,或者嵌入。比如这个2.用户授权,用authCode回调我们的后台接口3.将authCode换成token,token获取用户信息,指向首页。这一步后台写接口,将token与authCode交换,从token中获取用户信息,然后处理自己的业务逻辑,跳转到首页,完成登录。示例地址http://st.mawenqing.net/api/u...代码实现下面以nodejs的midwayjs框架为例midwayjs是阿里开源的未来的nodejs框架midway官网http://www.midwayjs.org/第三方授权用的钉钉,本来想用微信的,后来发现微信开放平台个人注册不太方便。1、直接跳转到授权页面调用登录接口,后端重定向到钉钉授权页面,所以需要一个后端重定向接口,如下import{Inject,Controller,Get,Query}from'@midwayjs/decorator';从'@midwayjs/koa'导入{Context};从'../service/user.service'导入{UserService};从'../service/aliyun.service'导入{AliYunService};从“导入BaseController”。./core/baseController";@Controller('/api/user')exportclassUserControllerextendsBaseController{@Inject()ctx:Context;@Inject()用户服务:用户服务;@Get('/login')asynclogin(){consturl=this.userService.dingTalkLogin();this.ctx.redirect(url)}}2.用户操作后,用代码回调处理逻辑。用code给我们回调其实就是重定向,可以看成是get请求。于是写一个接口处理回调请求a,用代码获取AccessTokenb,AccessToken换取用户信息c,然后处理业务逻辑,比如判断用户是否存在,存在则登录,如果存在则登录它不存在,注册,登录,最后重置指向主页。/***用户授权回调*@paramauthCode*/@Get('/auth')asyncauth(@Query('authCode')authCode){//a.使用代码constresult=awaitthis.userService获取AccessToken。用户访问令牌(授权码);if(!result.accessToken){returnthis.fail()}//b.AccessToken换取用户信息constuserInfo=awaitthis.userService.getUserInfo(result.accessToken)//c.后面会处理业务逻辑,比如判断用户是否存在,存在则登录,不存在则注册,然后登录,最后重定向到首页。//判断用户是否存在userInfo.nick,mobile:userInfo.mobile,createTime:newDate()}//没有注册仓库awaitthis.userService.saveUser(user)}//设置cookie,所以伪代码this.ctx.cookies被记录.set('st_user',JSON.stringify(user),{path:'/',//写入cookie的路径maxAge:10*60*1000,//cookie的有效期//expires:newDate('2017-02-15'),//cookie过期时间httpOnly:true,//是否仅用于http请求获取overwrite:false,//是否允许重写encrypt:true,//加密传输});//重定向到首页this.ctx.redirect('/')}github代码链接https://github.com/girl-email...总结通过以上,我们了解了第三方的基本流程授权登录,实现钉钉第三方网站授权登录,今天就到这里,希望对大家有所帮助,下期见。