业务用户账号密码校验(登录)脚本
背景信息
业务用户无论是使用“前台登录”还是“后台登录”,实现业务用户登录的基础都需要创建一个账号密码校验脚本。以“A”应用为例,介绍如何创建账号密码校验脚本。
操作步骤
- 在“我的应用”中,单击“A”应用,进入应用开发页面。
- 将鼠标放在“Script”上,单击界面上出现的“+”,在弹出菜单中选择“脚本”。
图1 脚本菜单
- 选中“创建一个新脚本”,“名称”设置为“login”,单击“添加”。
图2 新增脚本
- 在代码编辑器中,插入如下脚本代码。
import * as buffer from"buffer"; import * as crypto from"crypto"; import * as db from"db"; //定义入参结构,账号的用户名、密码为必需字段。如果根据业务需要,需其校验他字段(例如验证码),则根据账号密码字段的格式进行新增即可。 @action.object({type:"param"}) export class ActionInput{ @action.param({type:'String', required:true, label:'string'}) username:string; //用户名 @action.param({type:'String', required:true, label:'string'}) password:string; //密码 @action.param({type:'String', required:true, label:'string'}) captcha:string; //验证码,本脚本只是为了校验账号密码,因此用不到验证码,验证码也不是必需字段。在实现业务用户后台登录的Flow中,Flow调用此脚本,需要判断验证码,所以在此脚本中添加了验证码字段。 } //定义出参结构,结构中的字段可以根据业务需要按下方样例结构进行添加或减少。 @action.object({type:"param"}) export class ActionOutput{ @action.param({type:'String'}) msg:string;//登录信息 @action.param({type:'String'}) username:string;//用户名 @action.param({type:'String'}) userId:string;//用户ID @action.param({type:'String'}) captcha:string;//验证码 } //使用数据对象PortalUser @useObject(['PortalUser']) @action.object({type:"method"}) export class Login{ //定义接口类,接口的入参为ActionInput,出参为ActionOutput @action.method({ input:'ActionInput', output:'ActionOutput'}) public login(input:ActionInput):ActionOutput{ let out =new ActionOutput(); //新建出参ActionOutput类型的实例,作为返回值 let error =new Error(); //新建错误类型的实例,用于在发生错误时保存错误信息 try{ out.captcha = input.captcha; let s = db.object('PortalUser'); let condition ={ "conjunction":"AND", "conditions":[{ "field":"usrName", "operator":"eq", "value": input.username }] }; let user = s.queryByCondition(condition); if(user && user.length ==1){ if(validate(user[0].passwordSalt, user[0].userPassword, input.password)){ out.msg ="登录成功!"; out.username = user[0].usrName; out.userId = user[0].id; }else{ out.msg ="账号或者密码错误!"; } }else{ out.msg ="账号或者密码错误!"; } }catch(error){ console.error(error.name, error.message); out.msg = error.message; } return out; } } function _salt(password:string, saltBuf: buffer.Buffer, encoding: buffer.Encoding= buffer.Encoding.Base64):string{ const passwordBuf = buffer.from(password) const crypt = crypto.pbkdf2(passwordBuf, saltBuf,1000,32, crypto.Hashs.SHA1) return crypt.toString(encoding) } function validate(salt:string, userSaltedPassword:string, password:string, encoding: buffer.Encoding= buffer.Encoding.Base64):boolean{ const saltBuf = buffer.from(salt, encoding); const saltedPassword = _salt(password, saltBuf, encoding); return saltedPassword === userSaltedPassword }
- 单击编辑器上方的,保存脚本。
- 测试脚本能否正常执行。
- 单击编辑器上方的,执行脚本。
- 在界面底部的输入参数中,输入如下测试数据,单击。
其中,“test_cs”、“{XXXXXXXX}”为注册的业务用户账号和密码,“captcha”验证码非必填项为空。
在业务配置中心创建的业务用户和使用脚本创建的业务用户不能通用,故此处设置的业务用户(如test_cs)不能为在业务配置中心创建的业务用户。业务配置中心创建的业务用户,只能在默认登录页中使用。
{ "username":"test_cs", "password":"{XXXXXXXX}", "captcha":"" }
执行成功后,在“输出参数”中可参看结果。
图3 返回结果
- 测试成功后,单击编辑器上方的,启用该脚本。