npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

enhancer-thirdparty-api

v2.0.7

Published

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

Downloads

128

Readme

自定义登陆相关配置

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": "[email protected]",
          "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":"[email protected]",
          "leader_in_dept":{
            "leader":"true",
            "dept_id":"2"
          },
          "mobile":"18513027676",
          "active":"true",
          "org_email":"[email protected]",
          "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();
} 

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