企业微信授权登录(Oauth2.0)

企业微信授权登录(Oauth2.0)

OAuth2简介

OAuth2的设计背景,在于允许用户在不告知第三方自己的帐号密码情况下,通过授权方式,让第三方服务可以获取自己的资源信息。

下面简单说明OAuth2中最经典的Authorization Code模式,流程如下:

img

程图中,包含四个角色。

  • ResourceOwner为资源所有者,即为用户
  • User-Agent为浏览器
  • AuthorizationServer为认证服务器,可以理解为用户资源托管方,比如企业微信服务端
  • Client为第三方服务

调用流程为:
A) 用户访问第三方服务,第三方服务通过构造OAuth2链接(参数包括当前第三方服务的身份ID,以及重定向URI),将用户引导到认证服务器的授权页
B) 用户选择是否同意授权
C) 若用户同意授权,则认证服务器将用户重定向到第一步指定的重定向URI,同时附上一个授权码。
D) 第三方服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。
E) 认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken(调用凭证)

实际使用OAuth流程

我们日常中使用的登录大多以账号密码登录为主,在企业pass服务盛行的今天,我们也会把一些业务系统或者一些人事系统集成到企业微信或者钉钉上。恰好遇到一个关于业务系统集成企业微信的需求,企业微信是支持Oauth2.0。不多BB,直接上图

企业微信OAuth2接入流程

img

自己开发的实际流程

在这里插入图片描述

  1. 在企业微信后台配置跳转的页面。
  2. 页面向自己的服务器后台发送http请求并且携带参数code。
  3. 自己的微信后台去和企业微信服务器后台进行交互,拿到用户的信息。
  4. 和自己的网关服务进行交互,拿到自己服务器的token,返回给前端。

代码开发

实际的代码流程十分简单,注意企业微信的token是需要缓存在服务器的,这里贴一个自己写的获取access_token并且缓存起来的代码,也算是上述这些流程里边稍微思考的. 省去了一些注释,防止暴露其他信息,代码思路可以参考。

private static volatile AccessToken accessToken;

public AccessToken getAccessToken() {
        if (accessToken == null){
            AccessToken token = freshAccessToken();
            if (token != null){
                accessToken = token;
            }
        }else {
            //计算上次记录的获取的时间
            long diffTime =(new Date().getTime())-(accessToken.getSatrtTime().getTime())+ 120;
            if(diffTime>=accessToken.getExpires_in()){//如果时间差加上提前的时间值大于等于了微信规定的有效期限则需要重新向微信服务器刷新最新accessToken值
                AccessToken toke = freshAccessToken();
                if(toke!=null){
                    accessToken = toke;
                }
            }
        }

        return accessToken;
    }

    /**
     *  请求企业微信后台服务 获取access_token
     * @return
     */

    private synchronized AccessToken  freshAccessToken() throws BaseException{
        String tokenBody = HttpUtil.get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+ QWeChatConstant.COPE_ID+"&corpsecret="+QWeChatConstant.COPE_SECRET);
        JSONObject jsonObject = JSON.parseObject(tokenBody);
        AccessToken accessToken = null;
        if (jsonObject.getIntValue("errcode")==0){
            String accessTokenString = jsonObject.getString("access_token");
            String expiresIn = jsonObject.getString("expires_in");
            Timestamp startTime = new Timestamp(new Date().getTime());
            accessToken = new AccessToken(accessTokenString, Long.parseLong(expiresIn), startTime);
        }
        return accessToken;
    }
}
在Vue项目中使用微信OAuth2.0授权登录,可以通过以下步骤实现: 1. 在微信公众平台或开放平台中申请应用,并获取到appID和appSecret。 2. 在Vue项目中安装wechat-oauth模块,该模块提供了微信OAuth2.0的相关接口。 ``` npm install wechat-oauth ``` 3. 在Vue项目的后端服务器中,编写一个处理微信OAuth2.0授权登录的回调接口,并在该接口中调用wechat-oauth模块提供的接口,实现用户授权登录。 ``` const OAuth = require('wechat-oauth'); const client = new OAuth(appId, appSecret); // 获取授权地址并重定向到该地址 router.get('/wechat/login', async (ctx, next) => { const redirectUrl = client.getAuthorizeURL( 'http://your-redirect-url', '', 'snsapi_userinfo' ); ctx.redirect(redirectUrl); }); // 处理授权回调 router.get('/wechat/callback', async (ctx, next) => { const code = ctx.query.code; const token = await client.getAccessToken(code); const openid = token.data.openid; const userInfo = await client.getUser(openid); // TODO: 处理用户信息 }); ``` 4. 在Vue项目中,提供一个“使用微信登录”的按钮,点击该按钮时,重定向到后端服务器中的授权接口,实现用户授权登录。 ``` <template> <div> <button @click="loginWithWechat">使用微信登录</button> </div> </template> <script> export default { methods: { loginWithWechat() { window.location.href = 'http://your-server/wechat/login'; } } } </script> ``` 需要注意的是,使用微信OAuth2.0授权登录,需要用户在微信客户端中进行操作,因此需要在移动端或微信公众号中使用。同时,需要在微信公众平台或开放平台中配置授权回调地址,并保证该地址可以被访问到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值