SDK for Node.js

Node SDK 用于 Node 环境下,可以用于管理用户池中所有用户,拥有全部操作权限。

Github:https://github.com/Authing/authing.js

安装

NPM

当构建大规模应用时,我们推荐使用 npm 进行安装。

# latest stable
$ npm install authing-js-sdk --save

初始化

先从 Authing 控制台获取用户池 ID 和 Secret

初始化代码:

const auth = new Authing({
userPoolId: 'your_userpool_id',
secret: 'your_userpool_secret'
});
// 初始化之后可以直接使用相关代码
auth.register({...}).then((info) => {
});
auth.login({...}).then((info) => {
});

其他参数

  • preflight

    • 是否开启网络状况预检,默认为 false。此参数适用于检查用户的网络是否屏蔽了 authing.cn 这个域名(某些企业的内网会屏蔽这个域名),检查成功不进行任何通知,检查失败后会调用传入的错误处理函数。执行预检之后会导致 SDK 初始化速度变慢,请谨慎使用。

  • cdnPreflight

    • 是否开启 CDN 网络状况预检,默认为 false。此参数适用于检查用户的网络是否可以访问七牛云 CDN(某些开了代理的场景下无法访问),检查成功不进行任何通知,检查失败后会调用传入的错误处理函数。执行 CDN 预检之后会导致 SDK 初始化速度变慢,请谨慎使用。

  • timeout

    • 超时时间,默认为 10000 毫秒(10 秒)。

  • onInitError,function(err) {}

    • 错误处理函数,用于处理初始化失败错误、预检错误。

使用

Authing SDK 的所有 API 都支持 Promise

const Authing = require('authing-js-sdk');
const authing = new Authing({
userPoolId: 'your_userpool_id',
secret: 'your_userpool_secret'
});
authing.login({
email: 'test@testmail.com',
password: 'testpassword'
}).then(function(user) {
console.log(user);
}).catch(function(error) {
console.log(error);
});

如果你使用 ES6+ 推荐用 await 处理异步,示例如下:

const Authing = require('authing-js-sdk');
const main = async () => {
let auth = new Authing({
userPoolId: 'your_client_id',
secret: 'your_userpool_secret'
});
let user;
//使用async时需要使用 try...catch... 捕捉错误
try {
user = await auth.login({
email: 'test@testmail.com',
password: 'testpassword'
});
}catch(error) {
console.log('登录失败:', error);
}
if(user) {
console.log('login success');
}else {
console.log('login failed');
}
}
main();

注册

Authing.register(options)

  • 参数:

    • {Object} options

      • email

      • password

      • unionid,若不使用 email 和 password 则 unionid 必选

      • oauth 可选,oauth 信息的字符串,或者其他自定义的用户字段都可以以 JSON 字符串的形式存在这里

      • username,可选,用户名

      • nickname,可选,昵称

      • company,可选,公司名称

      • photo,可选,用户头像

      • lastIP,可选,用户登录的 IP 地址

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      const userInfo = await authing.register({
      email: email,
      password: password
      }).catch((error) => { ... });;
      })();
  • 返回数据:

    • {
      "_id": "59e5ff4935eebf1913cfe8a1",
      "email": "test@test.com",
      "emailVerified": false,
      "username": "test@test.com",
      "nickname": "",
      "company": "",
      "photo": "http://www.xiaohehe.net/uploads/allimg/150305/304-1503051H136.png",
      "browser": "",
      "token": null,
      "tokenExpiredAt": null,
      "loginsCount": 0,
      "lastLogin": "Tue Oct 17 2017 21:02:01 GMT+0800 (CST)",
      "lastIP": null,
      "signedUp": "Tue Oct 17 2017 21:02:01 GMT+0800 (CST)",
      "blocked": false,
      "isDeleted": false,
      "group": {
      "_id": "59e374332023830871913ebd",
      "name": "default",
      "descriptions": "default",
      "createdAt": "Sun Oct 15 2017 22:44:03 GMT+0800 (CST)"
      }
      }

登录

Authing.login(options)

  • 参数:

    • {Object} options

      • email

      • password

      • unionid,若不使用 email 和 password 则 unioinid 必选

      • verifyCode,可选,频繁注册时会要求输入验证码,返回数据会包含

      • MFACode,可选,如果用户开启了 MFA 会要求输入 6 位动态口令,返回数据会出现 1635 错误代码

      • lastIP,可选,若连续出现验证码验证失败情况,请将客户端 IP 填入

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      const userInfo = await authing.login({
      email: email,
      password: password
      }).catch((error) => {
      /* 如果错误信息提示需要输入验证码,则登录参数应为
      {
      email: email,
      password: password,
      verifyCode: verifyCode
      }
      /*
      });
      })();
  • 返回数据:

    • {
      "_id": "59e5ff4935eebf1913cfe8a1",
      "email": "86700229ww6ss@163.com",
      "emailVerified": false,
      "username": "86700229ww6ss@163.com",
      "nickname": "",
      "company": "",
      "photo": "http://www.xiaohehe.net/uploads/allimg/150305/304-1503051H136.png",
      "browser": "",
      "token": null,
      "tokenExpiredAt": null,
      "loginsCount": 0,
      "lastLogin": "Tue Oct 17 2017 21:02:01 GMT+0800 (CST)",
      "lastIP": null,
      "signedUp": "Tue Oct 17 2017 21:02:01 GMT+0800 (CST)",
      "blocked": false,
      "isDeleted": false,
      "group": {
      "_id": "59e374332023830871913ebd",
      "name": "default",
      "descriptions": "default",
      "createdAt": "Sun Oct 15 2017 22:44:03 GMT+0800 (CST)"
      }
      }

发送手机验证码

此接口可结合使用手机验证码登录使用。

Authing.getVerificationCode(phone)

  • 参数:

    • {String} phone

    • 手机号

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      const userInfo = await authing.getVerificationCode('phone number')
      .catch((error) => { ... })
      })();
  • 返回数据:

    • {
      code: 200, // 500 为失败
      message: '发送成功'
      }

短信模版

【Authing】{S8} 是你的验证码,有效时间为 {S2} 分钟。如非本人操作请忽略。

当前不支持修改短信模版。

验证码接口可结合使用手机验证码登录使用。

使用手机验证码登录

Authing.loginByPhoneCode(options)

  • 参数:

    • {Object} options

      • phone,必填,手机号

      • phoneCode,必填,使用发送短信接口获取

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      const userInfo = await authing.loginByPhoneCode({
      phone: 'Your Phone',
      phoneCode: 'Your Phone Code',
      }).catch((error) => { ... })
      })();
  • 返回数据:

    • {
      "_id": "59e5ff4935eebf1913cfe8a1",
      "email": "用户邮箱",
      "emailVerified": false,
      "username": "用户名",
      "nickname": "",
      "phone": "用户手机号",
      "company": "",
      "photo": "https://usercontents.authing.cn/client/logo@2.png",
      "browser": "",
      "token": null,
      "tokenExpiredAt": null,
      "loginsCount": 0,
      "lastLogin": "Tue Oct 17 2017 21:02:01 GMT+0800 (CST)",
      "lastIP": null,
      "signedUp": "Tue Oct 17 2017 21:02:01 GMT+0800 (CST)",
      "blocked": false,
      "isDeleted": false,
      }

使用 LDAP 登录

LDAP 服务的配置流程请参考配置 LDAP 服务

Authing.loginByLDAP(options)

  • 参数:

    • {Object} options

      • username,在 LDAP 服务中的登录名,可以是邮箱或用户名

      • password,在 LDAP 服务中的密码

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      const userInfo = await authing.loginByLDAP({
      username: 'Your LDAP username',
      passowrd: 'Your LDAP password',
      }).catch((error) => { ... })
      })();
  • 返回数据:

    • {
      "_id": "5cbe9a4347618069372e75ff",
      "username": "Nikola Tesla",
      "nickname": "Nikola Tesla",
      "oauth": "{\"dn\":\"uid=tesla,dc=example,dc=com\",\"controls\":[],\"objectClass\":[\"inetOrgPerson\",\"organizationalPerson\",\"person\",\"top\",\"posixAccount\"],\"cn\":\"Nikola Tesla\",\"sn\":\"Tesla\",\"uid\":\"tesla\",\"mail\":\"tesla@ldap.forumsys.com\",\"uidNumber\":\"88888\",\"gidNumber\":\"99999\",\"homeDirectory\":\"home\"}",
      "unionid": "uid=tesla,dc=example,dc=com",
      "registerMethod": "ldap:default::from-undefined",
      "email": "tesla@ldap.forumsys.com",
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImVtYWlsIjoidGVzbGFAbGRhcC5mb3J1bXN5cy5jb20iLCJ1bmlvbmlkIjoidWlkPXRlc2xhLGRjPWV4YW1wbGUsZGM9Y29tIiwiaWQiOiI1Y2JlOWE0MzQ3NjE4MDY5MzcyZTc1ZmYiLCJjbGllbnRJZCI6IjVjYTQwMjdjOGEzNjJjODIyZTI2ZDA0ZiJ9LCJpYXQiOjE1NTU5OTY1MjUsImV4cCI6MTU1NzI5MjUyNX0.gcKasWAzO0ZS4ay_KGGp_ihPKG_GaGXk5iQKzP6R4_w",
      "company": ""
      }

验证用户 Token

Authing.checkLoginStatus(options)

  • 参数:

    • {Object} options

      • user,必填,用户的 _id

  • 使用方法:

    • (async () => {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      const result = await authing.checkLoginStatus('USER_JWT_TOKEN');
      })()
  • 返回数据:

若 Token 合法,则返回数据为:

{
status: false,
code: 200,
message: '已登录',
token: {
... // Token 数据
}
}

当 status 为 false 时,有三种情况,分别返回:

{
status: false,
code: 2020,
message: '未登录'
}
{
status: false,
code: 2206,
message: '登录信息已过期'
}
{
status: false,
code: 2207,
message: '登录信息有误'
}

刷新用户 Token

Authing.refreshToken(options)

  • 参数:

    • {Object} options

      • user,必填,用户的 _id

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      const token = await authing.refreshToken({
      user: '59e5ff4935eebf1913cfe8a1'
      })
      .catch((error) => { ... })
      })();
  • 返回数据:

    • {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImVtYWlsIjoieGlleWFuZ0Bkb2RvcmEuY24iLCJpZCI6IjVkMDQ2M2FjODdkNmU5NTEwM2E3MTBjNSJ9LCJpYXQiOjE1NjA1NzEwNzYsImV4cCI6MTU2MTg2NzA3Nn0.qs-Q7UOC5wFa40uIau-50-VjSAVOVjr5nw2opzQeLYg",
      "iat": 1560571076,
      "exp": 1561867076
      }

退出

Authing.logout(uid)

  • 参数:

    • {String} uid,必填,用户的 _id

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      await authing.logout('59e5ff4935eebf1913cfe8a1')
      .catch((error) => { ... })
      })();
  • 返回数据:

    • {
      id: "59e5ff4935eebf1913cfe8a1"
      }

退出 SSO

如果你使用了 OAuth、OIDC 或 SAML 实现了单点登录,那么使用户退出登录需要跳转到一个 URL:

https://<你的域名>.authing.cn/login/profile/logout?app_id=<OAuth 应用 ID>&redirect_uri=<退出之后的回调地址>

其中 app_idredirect_uri 都是必填选项,redirect_uri 是退出后你想要返回的地址。

管理用户权限

获取单个用户资料

Authing.user(options)

  • 参数:

    • {Object} options

      • id,必填,用户的 _id

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });
      const userInfo = await authing.user({
      id: '59e5ff4935eebf1913cfe8a1'
      })
      .catch((error) => { ... })
      })();
  • 返回数据:

    • {
      "_id": "5a584dcd32e6510001a8f144",
      "email": "1968198962@qq.com",
      "emailVerified": false,
      "username": "1968198962@qq.com",
      "nickname": "",
      "company": "",
      "photo": "http://oxacbp94f.bkt.clouddn.com/user-avatars/Fqy_de1Jj5TmngEFiiY1-RsCCDcO",
      "browser": "",
      "registerInClient": "59f86b4832eb28071bdd9214",
      "registerMethod": "default:username-password",
      "oauth": "",
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImVtYWlsIjoiMTk2ODE5ODk2MkBxcS5jb20iLCJpZCI6IjVhNTg0ZGNkMzJlNjUxMDAwMWE4ZjE0NCJ9LCJpYXQiOjE1MTcwMzI1MjV9.Ah0Oii741L_wJHhiE5KtWDgRU1Q3x_fNZBNNM5MhqDc",
      "tokenExpiredAt": "Sat Jan 27 2018 13:55:25 GMT+0800 (CST)",
      "loginsCount": 0,
      "lastLogin": "Fri Jan 12 2018 13:55:25 GMT+0800 (CST)",
      "lastIP": null,
      "signedUp": "Fri Jan 12 2018 13:55:25 GMT+0800 (CST)",
      "blocked": false,
      "isDeleted": false,
      "__typename": "ExtendUser"
      }

一次性获取多个用户的资料

Authing.userPatch(options)

  • 参数:

    • {Object} options

      • ids

        • 要获取的用户 id 列表,使用逗号分割,不要出现多余的空格;如果使用非法 id 查询时系统会自动忽略。

  • 使用方法:

    • (async function() {
      const authing = new Authing({
      userPoolId: 'your_userpool_id',
      secret: 'your_userpool_secret'
      });