2.0.7 • Published 7 months ago

enhancer-thirdparty-api v2.0.7

Weekly downloads
3
License
ISC
Repository
-
Last release
7 months ago

自定义登陆相关配置

function(Enhancer, user, done) {
  var api = require('enhancer-thirdparty-api');

  api.login({
    enhancer: Enhancer, // 全局对象 可以直接引用
    user: user, //参数 可以直接引用, 也可以通过 Enhancer.getCurrentUser() 来获取
    complete: function (err, message, data) { //登陆完成的回调
      /*
        err: 报错对象, 如果无值则表示没有错误
        message: 错误提示消息
        data: {
          method: 'enhancer', // 说明是通过账号密码查询用户表登陆的
          //method: 'enterprise_wechat', // 说明是通过企业微信登陆的
          //method: 'dingtalk', // 说明是通过钉钉自建应用登陆的
          //method: 'dingtalk_third', // 说明是通过钉钉第三方网站登陆的
          //method: 'wechat_mp', // 说明是通过微信公众号登陆的
          //method: 'wechat_mini', // 说明是通过微信小程序登陆的
          //method: 'wechat_web', // 说明是通过微信网站应用登陆的
          //method: 'alipay', // 说明是通过支付宝登陆的
        }
      */
      done(err, message);
    },


    /* 微信小程序的配置  */
    miniWechatUserId: 'MINI_WX_USER_ID',  // 在用户表中存放 微信小程序的用户ID 的字段名
    miniWechatAppId: '',  // 小程序的appId
    miniWechatAppSecret: '', // 小程序的appSecret


    /* 企业微信的配置 */
    entWechatUserId: 'ENT_WX_USER_ID', // 在用户表中存放 企业微信用户ID 的字段名
    entWechatCorpid: '',  // 企业ID
    entWechatCorpsecret: '',  // Corpsecre
    entWechatAgentid: '',  // 获取的AgentId
    wxEntInfo: false, // 是否需要获取企业微信登录人的用户信息
    wxEntNickname: 'WX_ENT_NICKNAME', // 用户表中存放企业微信用户昵称的字段, 当 wxEntInfo 为 true 时才生效
    wxEntAvatar: 'WX_ENT_AVATAR', // 用户表中存放企业微信用户头像的字段, 当 wxEntInfo 为 true 时才生效
    customInfo: function (info, end) { // 根据当企业微信用户信息返回自定义用户信息
      /*
        end: 参考上面 complete 里面的 method, 但值不包含 'enhancer'
        info: { //企业微信中当前登陆用户信息
          "errcode": 0,
          "errmsg": "ok",
          "userid": "zhangsan",
          "name": "李四",
          "department": [1, 2],
          "position": "后台工程师",
          "mobile": "15913215421",
          "gender": 1,
          "tel": "62394",
          "email": "zhangsan@gzdev.com",
          "weixinid": "lisifordev",
          "avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0",
          "status": 1
        } 
        参考 https://doxmate.cool/node-webot/wechat-enterprise-api/api.html#api_user_exports_getUser
      */
      return {
        //根据 info 自定义要返回的字段, 返回的这些字段是否要入库 开发者自己在后面的步骤中决定
      }
    },


    /* 微信的配置 */
    mpWechatUserId: 'MP_WX_USER_ID', // 在用户表中存放 微信公众号ID(union_id 或 open_id) 的字段名
    mpWechatAppId: '',  // appId
    mpWechatAppSecret: '', // appSecret
    wxInfo: true, // 获取微信登录人的用户信息
    wxNickname: 'WX_NICKNAME', // 数据库里存储微信用户昵称的字段
    wxAvatar: 'WX_AVATAR', // 数据库里存储微信用户头像的字段
    customInfo: function(info, end) {//自定义获取哪些信息字段
      /*
        end: 参考上面 complete 里面的 method, 但值不包含 'enhancer'
        info: { //微信返回的用户信息对象
          "openid": "OPENID",
          "nickname": NICKNAME,
          "sex": 1,
          "province":"PROVINCE",
          "city":"CITY",
          "country":"COUNTRY",
          "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
          "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
          "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
        }
        // 参考 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
      */

      return {
        //根据 info 自定义要返回的字段, 返回的这些字段是否要入库 开发者自己在后面的步骤中决定
      }
    }, 
    /*微信网站应用配置(扫描二维码登陆)*/
    webWechatAppId: '',  // appId
    webWechatAppSecret: '', // appSecret



    /*钉钉的配置*/
    dingtalkUserId: 'DINGTALK_USER_ID, // 在用户表中存放 钉钉用户ID 的字段名 
    dingtalkAppKey: '',  // AppKey
    dingtalkAppSecret: '', // AppSecret
    ddInfo: false, //获取钉钉用户信息
    ddNickname: 'DD_NICKNAME', //用户表中存放钉钉用户昵称的字段
    ddAvatar: 'DD_AVATAR',   //用户表中存放钉钉用户头像的字段
    customInfo: function (info, end) {
      /*
        end: 参考上面 complete 里面的 method
        info: { //钉钉返回的用户信息对象
          "extension":"{\"爱好\":\"旅游\",\"年龄\":\"24\"}",
          "unionid":"z21HjQliSzpw0YWxxxxx",
          "boss":"true",
          "role_list":{
            "group_name":"职务",
            "name":"总监",
            "id":"100"
          },
          "exclusive_account":false,
          "manager_userid":"manager240",
          "admin":"true",
          "remark":"备注备注",
          "title":"技术总监",
          "hired_date":"1597573616828",
          "userid":"zhangsan",
          "work_place":"未来park",
          "dept_order_list":{
            "dept_id":"2",
            "order":"1"
          },
          "real_authed":"true",
          "dept_id_list":"[2,3,4]",
          "job_number":"4",
          "email":"test@xxx.com",
          "leader_in_dept":{
            "leader":"true",
            "dept_id":"2"
          },
          "mobile":"18513027676",
          "active":"true",
          "org_email":"test@xxx.com",
          "telephone":"010-86123456-2345",
          "avatar":"xxx",
          "hide_mobile":"false",
          "senior":"true",
          "name":"张三",
          "union_emp_ext":{
            "union_emp_map_list":{
              "userid":"5000",
              "corp_id":"dingxxx"
            },
            "userid":"500",
            "corp_id":"dingxxx"
          },
          "state_code":"86"
        }
        //参考 https://open.dingtalk.com/document/orgapp/query-user-details
      */
      return {
        //根据 info 自定义要返回的字段, 返回的这些字段是否要入库 开发者自己在后面的步骤中决定
      }
    }, // 自定义获取钉钉用户信息
    /* 钉钉第三方网站的配置 */
    dingtalkAppId: '',  // appId
    dingtalkUnionId: 'DINGTALK_UNION_ID', // 在用户表中存放 钉钉UNION_ID 的字段名
    dingtalkThirdSecret: '', // appSecret

    /* 下面是支付宝的配置*/
    alipayUserId: 'ALIPAY_USER_ID', //在用户表中存放 支付宝 user_id 的字段名
    alipayPrivateKey: '',
    alipayPubKey: '', 	  

    // 如果你希望自动为你实现登录逻辑, 请检查下面的配置是否和你的应用一致
    userTableName: 'USERINFO',  // Enhancer 应用的用户表表名
    userId: 'USER_ID',  // 在用户表中存放 用户ID 的字段名 
    userName: 'USER_NAME',  // 在用户表中存放 用户名 的字段名
    userRoles: 'USER_ROLES',  // 在用户表中存放 用户角色 的字段名
    password: 'PASSWORD',  // 在用户表中存放 密码 的字段名
    customWhere: function(user) { //自定义自动登陆时 sql 的 where 条件 和参数
      return {
        where: `user_id = ? and password = ?`,
        param: [user.getId(), user.getPassword()]
      }
    }, 

    thirdpartyLogin: function (err, id, method, next) {// 自定义微信(钉钉等三方)应用登陆的过程
      /*
        err: 错误对象, 此参数已经废弃
        id: 微信(钉钉等三方)应用id
        method: 参考上面 complete 里面的 method
        next: function (err, rows, data)  {//获取到自定义信息后, 可以继续调用这个函数完成登陆
          // err: 为错误对象
          // rows: 为登陆信息, 可以是通过 id 去用户表里查出来的数据
          // data: [id] 
        }
        // next(err, rows, [id])
      */
    }, 

    enhancerLogin: function (id, method, next) { // 自定义通过账号密码登录的过程
      /*
        id: 微信(钉钉等三方)应用id
        method: 参考上面 complete 里面的 method
        next: 参考上面 thirdpartyLogin 中的 next
      */
    },

    customBind: function (id, method, info) {// 自定义微信(钉钉等三方)应用id和enhancer应用账号的绑定
      /*
        id: 微信(钉钉等三方)应用id
        method: 参考上面 complete 里面的 method
        info: 参考上面各个端上 customInfo 中的 info
      */

      // 根据info信息自己去完成和系统用户的绑定
    }

    multipleUser: function (rows, data) { //当获取到的用户有多个时, 自定义返回哪个
      /*
        rows: 多个登陆用户的信息
        data: 是一个数组, data[0] 为微信(钉钉等三方)应用id
      */
      return rows[0];
    }

    statusCheck: function (row) {//根据当前获取的登陆用户信息返回用户是否被禁用
      /*
        row: 登陆用户的信息
      */

      return '该账号已经被禁用'; // 如果返回了字符串 则认为该用户被禁用了 且字符串会被用作提示消息
    }

    bindVariable: true, //是否将登陆用户信息(row)里的字段自动绑定到系统变量里, 绑定后就可以直接使用 后端: @xxx@ 或 前端:@1-xxx@

    lang: 'zh-cn' // 如果值不为 zh-cn 则认为是英文
  });
}

enhancer-thirdparty-api 组件免登主要功能

下面将 enhancer-thirdparty-api 称为组件

  1. 通过 enhancer 系统的账号密码登录

    • 1.1 如果配置了 enhancerLogin 函数, 则你希望自定义登录过程

          enhancerLogin: function (id, method, next) {
            /*
               id:  如果有值 表示从微信(钉钉等)三方获取到的id
               method: 参考上面 complete 里面的 method
               next: 回调函数 调用后继续执行后续的登录操作
            */
             const db = Enhancer.getDatabaseService();
             const uid = user.getId();
             const pwd = user.getPassword();
             const sql = 'SELECT * FROM USERINFO WHERE USER_ID = ? AND PASSWORD = ? ';
             db.execute(sql, [uid, pwd], function (err, result) {  next(err,  result);  });
          }
    • 1.2 如果没有配置 enhancerLogin 函数, 则组件会根据用户名和密码组成 sql 语句自动查询登录

      • 如果配置了 customWhere 则 1.2 中sql语句的where 条件 和 参数 由 customWhere 提供
          customWhere: function(user) {
            return {
              where: `user_id = ? and password = ?`,
              param: [user.getId(), user.getPassword()]
           }
         } 
  2. 通过 微信(钉钉等三方)账号登录

    • 2.1 如果配置了 thirdpartyLogin, 则你希望自定义登录过程
          thirdpartyLogin: function (err, id, method, next) {
            /*
               err: 错误对象, 此参数已经废弃
               id:  表示从微信(钉钉等)三方获取到的id
               method: 参考上面 complete 里面的 method
               next: 回调函数 调用后继续执行后续的登录操作
            */
             const db = Enhancer.getDatabaseService();
             const sql = 'SELECT * FROM USERINFO WHERE ENT_WX_USER_ID = ? ';
             db.execute(sql, [id], function (err, result) {  next(err, result);  });
          }
  3. 微信(钉钉等三方)账号第一次登录后 将三方获取的id 绑定到 用户表里

    • 3.1 如果配置了 customBind, 则你希望自定义绑定过程
         customBind: function (id, method, info) {
           /*
              id:  表示从微信(钉钉等)三方获取到的id
              method: 参考上面 complete 里面的 method
              info: 参考上面各个端上 customInfo 中的 info
           */
            const db = Enhancer.getDatabaseService();
            const uid = user.getId();
            const sql = 'UPDATE USERINFO SET ENT_WX_USER_ID = ? WHERE  USER_ID = ?';
            db.execute(sql, [id, uid], function (err, result) {   });
         }

启动函数里的配置

function (Enhancer, done) {
  var  api = require('enhancer-thirdparty-api');

  /* 企业微信 */
  api.setEntWechat({
    enhancer: Enhancer,
    entWechatCorpid: '', // Corpid
    entWechatCorpsecret: '', // Corpsecret
    entWechatAgentid: '', // Agentid
  });
  const entWechat = api.getEntWechat();
  entWechat.getCacheToken((err, token)=> {}) //获取当前token

  api.setEntApps([ //设置多个企业微信账号
    {
      enhancer: Enhancer,
      entWechatCorpid: '应用1 Corpid'
      entWechatCorpsecret: '应用1 Corpsecret'
      entWechatAgentid: '应用1 Agentid',
      login: true // 表示用这个应用去实现免登
    },
    {
      enhancer: Enhancer,
      entWechatCorpid: '应用2 Corpid'
      entWechatCorpsecret: '应用2 Corpsecret'
      entWechatAgentid: '应用2 Agentid'
    }
  ]); 

  const apps = api.getEntApps();
  /* 企业微信 */




  /* 微信 */
  api.setMPWechat({
    enhancer: Enhancer,
    mpWechatAppId: '',  // 请修改成对应的值
    mpWechatAppSecret: '', // 请修改成对应的值
    webWechatAppId: '',  // 请修改成对应的值
    webWechatAppSecret: '', // 请修改成对应的值
  });
  const wechat = api.getMPWechat();
  wechat.getCacheToken((err, token)=> {}) //获取当前token
  // https://github.com/node-webot/wechat-api
  /* 微信 */


  /* 钉钉 */
  api.setDingTalk({
    enhancer: Enhancer,
    dingtalkAppKey: '', // AppKey
    dingtalkAppSecret: '' // AppSecret
  });
  const dingding = api.getDingTalk();
  dingding.getCacheToken((err, token)=> {}) //获取当前token
  // https://github.com/ali-sdk/node-dingtalk
  /* 钉钉 */

  /* 微信小程序 */
  const miniWechat = api.getMiniWechat();
  miniWechat.getCacheToken((err, token)=> {})
  /* 微信小程序 */

  done();
} 

具体各端的具体配置请参考

2.0.7

7 months ago

2.0.5

2 years ago

2.0.4

2 years ago

2.0.6

2 years ago

2.0.3

3 years ago

2.0.2

4 years ago

2.0.1

4 years ago

2.0.0

4 years ago

1.1.9

4 years ago

1.1.8

4 years ago

1.1.7

5 years ago

1.1.6

5 years ago

1.1.5

5 years ago

1.1.4

5 years ago

1.1.3

5 years ago

1.1.2

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.18

5 years ago

1.0.17

5 years ago

1.0.16

5 years ago

1.0.15

5 years ago

1.0.14

5 years ago

1.0.13

5 years ago

1.0.12

5 years ago

1.0.11

5 years ago

1.0.10

6 years ago

1.0.9

6 years ago

1.0.8

6 years ago

1.0.7

6 years ago

1.0.6

6 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago