SDK for Web
JavaScript SDK 支持 Angular.js, React.js, Vue.js 以及 Node.js.我们提供了完全一致的接口。
Github:https://github.com/Authing/authing.js。
安装
NPM
当构建大规模应用时,我们推荐使用 npm
进行安装, 它可以与一些模块打包工具很好地配合使用,如 Webpack
, Browserify。
# latest stable
$ npm install authing-js-sdk --save
初始化
先从 Authing 控制台 中 获取 Client ID。
为保证 secret 安全,在服务端的初始化和客户端的初始化有所不同。
服务端
服务端可直接传入 clientId
和 secret
。
const auth = new Authing({
clientId: 'your_client_id',
secret: 'your_client_secret'
});
auth.then((authing) => {
// authing.login
// authing.register
// ...
});
客户端
客户端需传入三个参数
clientId
应用 ID,可从 Authing 控制台中获取。
timestamp
当前时间戳
Math.round(new Date() / 1000)
nonce
一个随机数字,不要超过十位数
示例
const auth = new Authing({
clientId: 'your_client_id',
timestamp: Math.round(new Date() / 1000),
nonce: Math.ceil(Math.random() * Math.pow(10, 6)),
});
auth.then((authing) => {
// authing.login
// authing.register
// ...
});
其他参数
noSecurityChecking
关闭网络安全预检,默认为 false。开启此参数后,构造函数不返回
Promise
,捕获构造函数的错误必须使用try...catch...
;关闭此参数后,构造函数返回Promise
,开发者可在Promise
的catch
或try...catch...
中捕获错误。
preflight
是否开启网络状况预检,默认为 false。此参数适用于检查用户的网络是否屏蔽了 authing.cn 这个域名(某些企业的内网会屏蔽这个域名),检查成功不进行任何通知,检查失败后会抛出错误,开发者可在
Promise
的catch
或try...catch...
中捕获错误。执行预检之后会导致 SDK 初始化速度变慢,请谨慎使用。
cdnPreflight
是否开启 CDN 网络状况预检,默认为 false。此参数适用于检查用户的网络是否可以访问七牛云 CDN(某些开了代理的场景下无法访问),检查成功不进行任何通知,检查失败后会抛出错误,开发者可在
Promise
的catch
或try...catch...
中捕获错误。执行 CDN 预检之后会导致 SDK 初始化速度变慢,请谨慎使用。
timeout
超时时间,默认为 10000(10 秒)。
使用
Authing SDK 的所有 API 都支持 Promise。
const Authing = require('authing-js-sdk');
// 对 Client ID 和 Client Secret 进行验证,获取 Access Token
const auth = new Authing({
// 若在浏览器端请使用 timestamp + nonce + clientId 的形式
clientId: 'your_client_id',
secret: 'your_app_secret'
});
auth.then(function(authing) {
//验证成功后返回新的 authing-js-sdk 实例(authing),可以将此实例挂在全局
authing.login({
email: 'test@testmail.com',
password: 'testpassword'
}).then(function(user) {
console.log(user);
}).catch(function(error) {
console.log(error);
});
}).catch(function(error) {
//验证失败
console.log(error);
});
如果你使用 ES6+
推荐用 await
处理异步,示例如下:
import Authing from 'authing-js-sdk';
const main = async () => {
//使用async时需要使用 try...catch... 捕捉错误
let auth;
try{
auth = await new Authing({
// 若在浏览器端请使用 timestamp + nonce + clientId 的形式
clientId: 'your_client_id',
secret: 'your_app_secret'
});
}catch(error) {
console.log('Authing 验证失败:', error);
}
if(auth) {
let user;
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 = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); 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 = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); 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 = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); 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 = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); 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 = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); 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 = await new Authing({ clientId: 'your_client_id', secret: 'your_client_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 = await new Authing({ clientId: 'your_client_id', secret: 'your_client_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 = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); 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_id
和 redirect_uri
都是必填选项,redirect_uri
是退出后你想要返回的地址。
管理用户权限
配置用户权限读取/修改用户权限获取单个用户资料
Authing.user(options)
参数:
{Object} options
id,必填,用户的 _id
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); 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 = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); const userInfo = await authing.userPatch({ ids: '5a584dcd32e6510001a8f144,5c08fa74583d9d00019d245e' }) .catch((error) => { ... }) })();
返回数据:
{ list: [ { _id: '5c0a3565583d9d000219d3960', unionid: 'oVzVG4wo1v0c7uyiFQtHc3Nrl2hg', email: null, emailVerified: false, username: 'xxxxxxxxxxxxxxxxx', nickname: 'xxxxxxxxxxxxxxxxx', company: '', photo: 'xxxxxxxxxxxxxxxxx', browser: '', registerInClient: 'xxxxxxxxxxxxxxxxx', registerMethod: 'oauth:wechat', oauth: 'xxxxxxxxxxxxxxxxx', token: 'xxxxxxxxxxxxxxxxx', tokenExpiredAt: 'Sat Dec 22 2018 16:55:01 GMT+0800 (CST)', loginsCount: 1, lastLogin: 'Fri Dec 07 2018 16:55:01 GMT+0800 (CST)', lastIP: '114.93.36.228', signedUp: 'Fri Dec 07 2018 16:55:01 GMT+0800 (CST)', blocked: false, isDeleted: false, userLocation: null, userLoginHistory: null }, { _id: '5c08fa74583d9d00019d24ee', unionid: 'xxxxxxxxxxxxxxxxx', email: null, emailVerified: false, username: 'xxxxxxxxxxxxxxxxx', nickname: 'xxxxxxxxxxxxxxxxx', company: '', photo: 'xxxxxxxxxxxxxxxxx', browser: '', registerInClient: 'xxxxxxxxxxxxxxxxx', registerMethod: 'oauth:wechat', oauth: 'xxxxxxx', token: 'xxxxxxx', tokenExpiredAt: 'Fri Dec 21 2018 18:31:16 GMT+0800 (CST)', loginsCount: 1, lastLogin: 'Thu Dec 06 2018 18:31:16 GMT+0800 (CST)', lastIP: '221.192.178.75', signedUp: 'Thu Dec 06 2018 18:31:16 GMT+0800 (CST)', blocked: false, isDeleted: false, userLocation: null, userLoginHistory: null } ], totalCount: 2 }
获取用户列表
Authing.list(page, count)
参数:
{Number} page
Default:
1
{Number} count
Default:
10
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); const userInfo = await authing.list() .catch((error) => { ... }) })();
返回数据:
{ totalCount: 222, list: [{ "_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.remove(uid)
参数:
{String} uid
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); const uid = '59e5ff4935eebf1913cfe8a1'; const userInfo = await authing.remove(uid) .catch((error) => { ... }) })();
返回数据:
{ _id: '59e5ff4935eebf1913cfe8a1' }
上传头像
Authing.selectAvatarFile(cb)
参数:
{function} cb
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); authing.selectAvatarFile((avatarURL) => { // avatarURL 即为头像地址(公网 URL) }) })();
结果:
此 API 会打开文件选择窗口供用户选择文件,用户选取文件后,系统会自动上传,上传成功后会调用 cb,并把头像 URL 作为参数传入 cb 函数,开发者可将回调函数中的 avatarURL 作为 photo 参数传入 update 方法中修改用户头像。
修改用户资料
若使用 JavaScript
调用,需要使用 then().catch()
捕获结果和错误。
Authing.update(options)
此接口可以用来修改密码、昵称、头像等各种用户信息
参数:
{Object} options
_id
{String} 必填
email
{String},选填
emailVerified:
{Boolean},选填,邮箱是否经过验证
username:
{String},选填
nickname:
{String},选填
company:
{String},选填
phone:
{String},选填
oauth:
{String},选填,oauth 信息
photo:
{String || file object},选填,用户头像
browser:
{String},选填,用户注册时所用的浏览器
password:
{String},选填,用户密码
oldPassword:
{String}(
当有 password 时,旧密码参数必需填写)token:
{String},选填
tokenExpiredAt:
{String},选填,token 过期时间
loginsCount:
{Number},选填,登录次数
lastLogin:
{String},选填,最后登录时间
lastIP:
{String},选填,最后登录 IP
signedUp:
{String},选填,注册时间
blocked:
{Boolean},选填,是否被锁定
isDeleted:
{Boolean},选填,是否被删除
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); // 修改邮箱 await authing.update({ _id: "59e5ff4935eebf1913cfe8a1", email: 'xxx@xxx.com', }); })();
返回数据:
{ "_id": "59e5ff4935eebf1913cfe8a1", "email": "xxx@xxx.com", "emailVerified": false, "username": "premail@premail.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)" } }
重置密码
1. 发送验证码 Authing.sendResetPasswordEmail(options)
参数:
{Object} options
email
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); // 发送验证码到指定邮箱 await authing.sendResetPasswordEmail({ email: 'xxx@xxx.com', }); })();
返回数据:
{ "message":"成功", "code":null, "__typename": "CommonMessage" }
2. 验证验证码 Authing.verifyResetPasswordVerifyCode(options)
参数:
{Object} options
email
verifyCode
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); // 验证验证码 await authing.verifyResetPasswordVerifyCode({ email: 'xxx@xxx.com', verifyCode: 'verifyCode', }); })();
返回数据:
{ "message": "验证成功,请输入新密码", "code": null, "__typename": "CommonMessage" }
3. 发送新密码 Authing.changePassword(options)
参数:
{Object} options
email
password
verifyCode
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); await authing.changePassword({ email: 'xxx@xxx.com', password: 'new_password', verifyCode: 'verifyCode', }); })();
返回数据:
{ "_id":"5a2a723d598e37000106786a", "email":"1968108962@qq.com", "emailVerified":true, "username":"1968108962@qq.com", "nickname":"", "company":"","photo":"http://oxacbp94f.bkt.clouddn.com/authing-avatar.png","browser":"", "registerInClient":"59f86b4832eb28071bdd9214","registerMethod":"default:username-password", "oauth":"","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImVtYWlsIjoiMTk2ODEwODk2MkBxcS5jb20iLCJpZCI6IjVhMmE3MjNkNTk4ZTM3MDAwMTA2Nzg2YSJ9LCJpYXQiOjE1MTQwMjcyNDd9.vWrlzKY-Qr0SXwx8k__BF0ADCBjqGgMWP-wVOWgbH7A","tokenExpiredAt":"Sat Dec 23 2017 19:07:27 GMT+0800 (CST)","loginsCount":1,"lastLogin":"Fri Dec 08 2017 19:07:27 GMT+0800 (CST)","lastIP":"172.20.0.1", "signedUp":"Fri Dec 08 2017 19:06:37 GMT+0800 (CST)", "blocked":false,"isDeleted":false, "__typename":"ExtendUser" }
验证用户邮箱
发送验证邮件 Authing.sendVerifyEmail(options)
参数:
{Object} options
email: 需要验证的邮箱
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); await authing.sendVerifyEmail({ email: 'xxx@xxx.com', }); })();
返回数据:
{ message: "发送验证邮件成功", __typename: "CommonMessage" }
发送之后,用户将会收到一个包含验证链接的邮件,当用户打开此链接,我们将进行验证。
解绑邮箱
若使用 JavaScript
调用,需要使用 then().catch()
捕获结果和错误。
Authing.unbindEmail(options)
参数:
{Object} options
user
{String} 用户 ID,可选,默认为当前登录用户的 ID
client
{String} 应用 ID,可选,默认为当前登录应用的 ID
使用方法:
Authing.unbindEmail(); (async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); await authing.unbindEmail(); })();
返回数据:
{ "_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 }
注意事项
若未绑定其他登录方式, 则不可解绑邮箱
查询用户授权的 SSO 应用列表
该接口返回用户在一个用户池下授权过的 OAuth 和 OIDC 应用列表。
Authing.getAuthedAppList(options)
参数:
{Object} options
clientId: 用户池 id,必传
userId:用户 id,必传
page:页数,可选,默认 1
count:每页数目,可选,默认 10
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); await authing.getAuthedAppList({ clientId: "5d023c7b5642461234b9c62e", userId: "5d765d4013d73a5e90b7857a", page: 1, count: 10 }); })();
返回数据:
{ "OAuthApps": [ { "_id": "5d5a8a7bbc7275af2cb71920", "name": "test1", "domain": "test123", "clientId": "5d5921ffaa016518f658498d", "description": "", "isDeleted": false, "grants": [ "authorization_code", "implicit", "refresh_token" ], "redirectUris": [ "http://qq.com" ], "when": "Mon Aug 19 2019 19:39:39 GMT+0800 (CST)" }, { "_id": "5d5e2e8b026f9d145bf89203", "name": "oauth1", "domain": "oauth1", "clientId": "5d5921ffaa016518f658498d", "description": "", "isDeleted": false, "grants": [ "authorization_code", "implicit", "refresh_token" ], "redirectUris": [ "http://qq.com" ], "when": "Thu Aug 22 2019 13:56:27 GMT+0800 (CST)" } ], "OIDCApps": [ { "_id": "5d5a85e258375a32d1133d45", "name": "test1", "client_id": "5d5a85e258375a32d1133d45", "domain": "test1", "description": "test1", "authorization_code_expire": "600", "when": "Mon Aug 19 2019 19:20:02 GMT+0800 (CST)", "isDeleted": false, "id_token_signed_response_alg": "HS256", "response_types": [ "code" ], "grant_types": [ "authorization_code", "refresh_token" ], "token_endpoint_auth_method": "client_secret_post", "redirect_uris": [ "http://qq.com" ], "image": "https://usercontents.authing.cn/client/logo@2.png", "access_token_expire": "3600", "id_token_expire": "3600", "cas_expire": "3600" } ], "totalCount": 3 }
撤回用户对 SSO 应用的授权
Authing.revokeAuthedApp(options)
参数:
{Object} options
userPoolId: 用户池 id,必传
userId:用户 id,必传
appId:SSO 应用的 id,必传
使用方法:
(async function() { const authing = await new Authing({ clientId: 'your_client_id', timestamp: Math.round(new Date() / 1000), nonce: Math.ceil(Math.random() * Math.pow(10, 6)), }); await authing.revokeAuthedApp({ userPoolId: "5d023c7b5642461234b9c62e", userId: "5d765d4013d73a5e90b7857a", appId: "5d5e2e8b026f9d145bf89203" }); })();
返回数据:
{ "isRevoked": "true", "_id": "5d7661e17a9f981da5fa8098", "scope": "profile", "appId": "5d5e2e8b026f9d145bf89203", "userId": "5d765d4013d73a5e90b7857a", "type": "oauth" }
小程序扫码登录
小程序扫码登录指使用 Authing 小程序 身份管家
执行微信登录。 示例:小程序扫码登录
使用方法请参考:
接入小程序扫码登录自定义请求链接
Authing
构造函数包含一个名为 host
对象,可接收自定义的请求链接(适合私有部署 Authing 的用户使用),使用方法如下:
const auth = new Authing({
clientId: 'xxxx',
secret: 'xxxxxx',
host: {
user: 'https://users.authing.cn/graphql',
oauth: 'https://oauth.authing.cn/graphql'
}
});
host
对象中 user
和 oauth
的默认值是 Authing 官方的请求链接:
Last updated
Was this helpful?