场景简介
短信认证是最基本也是用户使用最多的辅助认证方式,熟悉了用户名密码+短信认证场景后,要实现其他类型的主认证+辅助认证(Radius/TOTP令牌),流程完全一致。
前置步骤
1.在实际集成之前,我们要确保已经进行过开发准备,选择了对应的集成方式
2.在aTurst控制台创建测试用户,并配置好用户名密码认证+短信辅助认证,参考产品手册
3.使用对应的Demo程序验证可以正常使用
流程图
集成步骤
1.用户名密码主认证
参考典型场景用户名密码认证
2.处理二次认证-短信验证码认证
如果您的服务器设置了短信验证的增强认证方式,在完成用户密码认证后,服务端认证结果会要求短信认证,对应nextAuth == atrust_auth_type::ATRUST_AUTH_TYPE_SMS。在进行短信认证之前,需要先获取到短信验证码。
示例代码
void* data;
atrust_error_code ec = atrust_sync_fetch_sms(&data);
switch (ec) {
// 成功
case atrust_error_code::OK:
// 短信验证码获取成功!
break;
case atrust_error_code::AUTH_CHAIN_INCOMPLETE:
// 认证链不完整,没有按照正确的顺序调用认证请求。
return;
case atrust_error_code::OUT_PARAM_WRITE_ERROR:
// 出参无法写入!
return;
case atrust_error_code::SDPC_UNINITIALIZED:
// 未调用初始化接口!
return;
case atrust_error_code::ATRUST_CONNECT_ERROR:
// aTrust客户端连接失败!如果重试任然失败,请检查aTrust客户端是否正确安装并运行。
return;
case atrust_error_code::BAD_ALLOC_ERROR:
// 内存分配失败。
return;
// 未知的业务执行过程失败
default:
// 接口调用失败!请在atrust_code.h中检查错误码,或尝试重试。错误码:ec
return;
}
if (data != NULL) {
atrust_auth_sms_data *smsdata = static_cast<atrust_auth_sms_data *>(data);
// 提示信息,注意编码方式以防乱码
// std::string tipsTranslate = Utf8ToGbk(smsdata->tips);
// 重新获取等待时间:smsdata->interval
// 释放内存
atrust_free(data);
data = nullptr;
}
注意 1.在调用获取短信验证码接口前,已经能够从上一次认证接口的data参数中获取到用户配置的手机号码了。
3.短信验证码认证
在获取到短信验证码之后,可以使用短信验证码进行认证登录。短信认证的思路和流程与用户名密码主认证基本相同。事实上,短信验证接口的出参格式合用户名密码主认证是一样的,但返回的内容有所不同。
示例代码
atrust_auth_type nextAuth;
void *data;
atrust_error_code ec = atrust_sync_login_by_sms(m_sms, &nextAuth, &data);
switch (ec) {
// 成功
case atrust_error_code::OK:
// 短信认证成功!
break;
case atrust_error_code::PASSPORT_FAILED:
// 认证失败,可能是验证码错误。
return;
case atrust_error_code::AUTH_PARAM_EMPTY:
// 输入的参数为空!
return;
case atrust_error_code::OUT_PARAM_WRITE_ERROR:
// 出参无法写入!
return;
case atrust_error_code::SDPC_UNINITIALIZED:
// 未调用初始化接口!
return;
case atrust_error_code::ATRUST_CONNECT_ERROR:
// aTrust客户端连接失败!如果重试任然失败,请检查aTrust客户端是否正确安装并运行。
return;
case atrust_error_code::UNSOPPORTED_NEXT_AUTH_TYPE:
// 服务端设置了不支持的增强认证方式。
return;
// 未知的业务执行过程失败
default:
// 接口调用失败!请在atrust_code.h中检查错误码,或尝试重试。错误码:ec
return;
}
switch (nextAuth) {
case atrust_auth_type::ATRUST_AUTH_TYPE_OK:
// 登录成功!
break;
// 一般不会出现双重辅助认证的情况
case atrust_auth_type::ATRUST_AUTH_TYPE_RADIUS:
// 短信认证成功!下一步辅助认证:Radius
break;
case atrust_auth_type::ATRUST_AUTH_TYPE_TOTP:
// 短信认证成功!下一步辅助认证:TOTP令牌
break;
default:
// 短信认证成功,但服务器返回了不支持的辅助认证类型
}
// 释放内存
atrust_free(data);
data = nullptr;
3.1 认证成功
当认证接口atrust_sync_login_by_sms返回结果为atrust_error_code::OK时表示本次认证操作已经成功。一般情况下辅助认证成功之后表示已经完成登录操作,登录成功之后aTrust客户端后台服务进程会从控制器上获取应用策略启动隧道服务,此时还不能立即访问隧道资源,需要等待隧道启动成功。
3.2 认证失败
当认证接口atrust_sync_login_by_sms返回结果不为atrust_error_code::OK时表示认证不成功,需要根据不同的错误码进行不同的操作,详情可参考demo程序或错误码说明。
3.3 处理下一次认证
当认证接口atrust_sync_login_by_sms返回结果为atrust_error_code::OK,但是nextAuth的结果不为atrust_auth_type::ATRUST_AUTH_TYPE_OK时,说明管理员还开启了其它增强认证,需要进一步处理下一次认证。(一般不会出现双重辅助认证的情况)