6.3 辅助认证
如果您的服务器针对用户只配置了用户名密码认证方式,则您的程序只需要调用用户名密码主认证接口,即可完成登录流程;如果您的服务器针对用户额外配置了增强认证方式,比如短信验证码认证、TOTP认证或Radius认证,那么需要调用其他增强认证接口来完成整个认证流程,并最终完成登录上线。
6.3.1 短信辅助认证
如果您的服务器设置了短信验证的增强认证方式,在完成上一次认证后,会要求继续进行短信辅助认证,(对应nextAuth == atrust_auth_type::ATRUST_AUTH_TYPE_SMS),
6.3.1.1 获取短信验证码
在进行短信认证之前,需要先调用获取短信验证码接口获取到验证码,需要注意的是,您在调用获取短信验证码接口前,已经能够从上一次认证接口的data参数中获取到用户配置的手机号码了。
接口定义
atrust_error_code ATRUST_API atrust_sync_fetch_sms(void **data);
参数和返回值说明
| 参数名 | 类型 | 出参/入参 | 必须 | 说明 | 
|---|---|---|---|---|
| 返回值 | atrust_error_code | out | aTrust标准错误及回复码 | |
| data | void** | out | 是 | 短信验证相关提示信息 | 
示例代码
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;
}
6.3.1.2 短信验证码认证
在您获取到短信验证码之后,您可以使用短信验证码进行认证登录。短信认证的思路和流程与用户名密码主认证基本相同。事实上,短信验证接口的出参格式合用户名密码主认证是一样的,但返回的内容有所不同。
认证结束后,用户可能登录成功并上线,此时nextAuth等于等于ATRUST_AUTH_TYPE_OK(0)并且返回的错误码为OK(0);也可能进入认证链的下一步增强认证;也有可能认证失败。
接口定义
atrust_error_code ATRUST_API
atrust_sync_login_by_sms(const char *code, atrust_auth_type *nextAuth, void **data);
参数和返回值说明
| 参数名 | 类型 | 出参/入参 | 必须 | 说明 | 
|---|---|---|---|---|
| 返回值 | atrust_error_code | out | aTrust标准错误及回复码 | |
| code | const char* | in | 是 | 验证码 | 
| nextAuth | atrust_auth_type* | out | 是 | 下一条增强认证类型 | 
| data | void** | out | 是 | 额外增强认证信息,具体参数类型和格式请根据nextAuth的不同类型来区分; 接口出现错误时,返回通用错误信息结构体额外增强认证信息,具体参数类型和格式请根据nextAuth的不同类型来区分。接口调用失败返回 atrust_common_error_info | 
接口出参data说明
- 接口返回成功
- 接口返回成功则
nextAuth出参非空,可根据nextAuth参数的取值,将data转换为对应的数据结构,其对应关系参考atrust_code.h。 - 如果配置了第三方认证服务器,则可以通过
data出参中的authServerInfo字段获取aTrust服务端透传的认证服务器信息。 
 - 接口返回成功则
 - 接口返回失败
  接口返回失败 且 
data非空的情况下,可以将data转换为通用的错误信息结构并从中获取错误码和具体的错误信息。其中错误码和接口返回值保持一致,错误信息与错误码一致。特殊地,如果是服务端返回的错误并且错误中包含动态信息,则可以从data中获取信息。 
示例代码
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:
    // 认证失败,可能是验证码错误。
    atrust_free(data);
    return;
case atrust_error_code::AUTH_PARAM_EMPTY:
    // 输入的参数为空!
    atrust_free(data);
    return;
case atrust_error_code::OUT_PARAM_WRITE_ERROR:
    // 出参无法写入!
    atrust_free(data);
    return;
case atrust_error_code::SDPC_UNINITIALIZED:
    // 未调用初始化接口!
    atrust_free(data);
    return;
case atrust_error_code::ATRUST_CONNECT_ERROR:
    // aTrust客户端连接失败!如果重试任然失败,请检查aTrust客户端是否正确安装并运行。
    atrust_free(data);
    return;
case atrust_error_code::UNSOPPORTED_NEXT_AUTH_TYPE:
    // 服务端设置了不支持的增强认证方式。
    atrust_free(data);
    return;
// 未知的业务执行过程失败
default:
    // 接口调用失败!请在atrust_code.h中检查错误码,或尝试重试。错误码:ec
    if(data != NULL) {
        atrust_common_error_info* errInfo = static_cast<atrust_common_error_info*>(data);
        data->code;     // 获取错误码
        data->message;  // 获取错误信息
    }
    atrust_free(data);
    data = NULL;
    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;
6.3.2 TOTP辅助认证
如果您的服务器设置了TOTP的增强认证方式,在完成上一次认证后,会要求继续进行TOTP辅助认证,(对应nextAuth == atrust_auth_type::ATRUST_AUTH_TYPE_TOTP
TOTP认证之前不需要像短信认证一样需要调用额外的接口,而是直接调用TOTP认证接口进行认证。TOTP认证接口的出参类型和用户名密码主认证相同,内容也几乎一样。
接口定义
atrust_error_code ATRUST_API
atrust_sync_login_by_totp(const char *totpToken, atrust_auth_type *nextAuth, void **data);
参数和返回值说明
| 参数名 | 类型 | 出参/入参 | 必须 | 说明 | 
|---|---|---|---|---|
| 返回值 | atrust_error_code | out | aTrust标准错误及回复码 | |
| totpToken | const char* | in | 是 | TOTP令牌 | 
| nextAuth | atrust_auth_type* | out | 是 | 下一条增强认证类型 | 
| data | void** | out | 是 | 额外增强认证信息,具体参数类型和格式请根据nextAuth的不同类型来区分; 接口出现错误时,返回通用错误信息结构体额外增强认证信息,具体参数类型和格式请根据nextAuth的不同类型来区分。接口调用失败返回 atrust_common_error_info | 
接口出参data说明
- 接口返回成功
- 接口返回成功则
nextAuth出参非空,可根据nextAuth参数的取值,将data转换为对应的数据结构,其对应关系参考atrust_code.h。 - 如果配置了第三方认证服务器,则可以通过
data出参中的authServerInfo字段获取aTrust服务端透传的认证服务器信息。 
 - 接口返回成功则
 - 接口返回失败
  接口返回失败 且 
data非空的情况下,可以将data转换为通用的错误信息结构并从中获取错误码和具体的错误信息。其中错误码和接口返回值保持一致,错误信息与错误码一致。特殊地,如果是服务端返回的错误并且错误中包含动态信息,则可以从data中获取信息。 
示例代码
atrust_auth_type nextAuth;
void *data;
atrust_error_code ec = atrust_sync_login_by_totp(m_totp, &nextAuth, &data);
switch (ec) {
// 成功
case atrust_error_code::OK:
    // TOTP令牌认证成功!
    break;
case atrust_error_code::PASSPORT_FAILED:
    // 认证失败,可能是TOTP过期或错误。
    atrust_free(data);
    return;
case atrust_error_code::AUTH_PARAM_EMPTY:
    // 输入的参数为空!
    atrust_free(data);
    return;
case atrust_error_code::OUT_PARAM_WRITE_ERROR:
    // 出参无法写入!
    atrust_free(data);
    return;
case atrust_error_code::SDPC_UNINITIALIZED:
    // 未调用初始化接口!
    atrust_free(data);
    return;
case atrust_error_code::ATRUST_CONNECT_ERROR:
    // aTrust客户端连接失败!如果重试任然失败,请检查aTrust客户端是否正确安装并运行。
    atrust_free(data);
    return;
case atrust_error_code::NO_PHONE_NUMBER_FOR_SMS_AUTH:
    // 设置了短信认证,但没有配置有效的号码。
    atrust_free(data);
    return;
case atrust_error_code::BAD_ALLOC_ERROR:
    // 内存分配失败。
    atrust_free(data);
    return;
case atrust_error_code::UNSOPPORTED_NEXT_AUTH_TYPE:
    // 服务端设置了不支持的增强认证方式。
    atrust_free(data);
    return;
// 未知的业务执行过程失败
default:
    // 接口调用失败!请在atrust_code.h中检查错误码,或尝试重试。错误码:ec
    if(data != NULL) {
        atrust_common_error_info* errInfo = static_cast<atrust_common_error_info*>(data);
        data->code;     // 获取错误码
        data->message;  // 获取错误信息
    }
    atrust_free(data);
    data = NULL;
    return;
}
switch (nextAuth) {
case atrust_auth_type::ATRUST_AUTH_TYPE_OK:
    // 登录成功!
    break;
//一般不会出现双重辅助认证的情况
case atrust_auth_type::ATRUST_AUTH_TYPE_SMS: {
    // TOTP令牌认证成功!下一步辅助认证:短信验证码
    atrust_auth_sms_phone_number_data *phoneData = static_cast<atrust_auth_sms_phone_number_data *>(data);
    if (phoneData != NULL) {
        // 用户手机号:phoneData->phone_number;
    }
    break;
}
case atrust_auth_type::ATRUST_AUTH_TYPE_RADIUS:
    // TOTP令牌认证成功!下一步辅助认证:Radius认证
    break;
default:
    // TOTP令牌认证成功,但服务器返回了不支持的辅助认证类型
}
// 释放内存
atrust_free(data);
data = nullptr;
6.3.3 Radius辅助认证
a. 辅助认证
如果您的服务器设置了Radius的增强认证方式,在完成上一次认证后,会要求继续进行Radius辅助认证,(对应nextAuth == atrust_auth_type::ATRUST_AUTH_TYPE_RADIUS
Radius作为辅助认证时和TOTP认证接口几乎相同,请注意不要调错了。
接口定义
atrust_error_code ATRUST_API
atrust_sync_login_by_radius(const char *radiusToken, atrust_auth_type *nextAuth, void **data);
参数和返回值说明
| 参数名 | 类型 | 出参/入参 | 必须 | 说明 | 
|---|---|---|---|---|
| 返回值 | atrust_error_code | out | aTrust标准错误及回复码 | |
| radiusToken | const char* | in | 是 | Radius令牌 | 
| nextAuth | atrust_auth_type* | out | 是 | 下一条增强认证类型 | 
| data | void** | out | 是 | 额外增强认证信息,具体参数类型和格式请根据nextAuth的不同类型来区分; 接口出现错误时,返回通用错误信息结构体额外增强认证信息,具体参数类型和格式请根据nextAuth的不同类型来区分。接口调用失败返回 atrust_common_error_info | 
示例代码
// 请参考【TOTP认证】
6.3.4 错误码说明
| 错误码 | KEY | 描述 | |
|---|---|---|---|
| 0 | OK | 操作成功 | |
| 10012 | AUTH_PARAM_EMPTY | 输入的参数为空 | |
| 10030 | UNSOPPORTED_NEXT_AUTH_TYPE | 服务端设置了不支持的增强认证方式 | |
| 20001 | SDPC_UNINITIALIZED | 未调用初始化接口 | |
| 20002 | ATRUST_CONNECT_ERROR | 本地aTrustAgent服务连接错误,可能aTrust后台服务进程未启动 | |
| 20003 | ATRUST_CLIENT_NOT_INSTALL | 本地未安装aTrust客户端 | |
| 75000000 | NO_PHONE_NUMBER_FOR_SMS_AUTH | 设置了短信认证,但没有配置有效的号码。 | |
| 75500000 | PASSPORT_FAILED | 认证失败,可能是用户名密码错误,或者用户已过期等原因 | |
| 75500001 | PASSPORT_SESSION_TIMEOUT | 开启辅助认证场景,主认证会话超时 | |
| 75500002 | PASSPORT_SESSION_INVALID | 开启辅助认证场景,主认证会话无效 | |
| 75500003 | PASSPORT_GLOBALDATA_NOT_EXITS | 认证全局数据不存在或已过期 | |
| 75500004 | PASSPORT_PARAM_ERROR | 认证输入参数错误 | |
| 75500005 | PASSPORT_CONFIG_ERROR | 认证配置错误 | |
| 75500006 | ALREADY_LOGIN | 用户已经登陆过了,可直接上线 | |
| 75500100 | PASSPORT_EXTERN_SERVER_TIMEOUT | 第三方服务器认证,外部服务器认证连接超时 | |
| 75500200 | PASSPORTTOKENINVALID | 开启辅助认证场景,TOKEN非法 | |
| 75500305 | PASSPORTUNMATCHEDDEVICEID | 不匹配的设备ID | |
| 75500311 | ERRCODE_ADD_TRUST_DEVICE_UPPER_LIMIT | 授信终端认证,认证达到上限 | |
| 75500400 | NETWORK_CONNECTION_ERROR | 第三方认服务器认证,连接认证服务器网络连接失败 | |
| 75510004 | PASSPORTINVLIDREQUEST | 非法的请求 | |
| 75510022 | PASSPORTUNENABLE | 认证未启用 | |
| 75599999 | PASSPORT_UNEXCPECTED_ERROR | 服务器通用错误,原因请查看服务端认证日志 | 
注意: 1.接口调用后的错误信息,既可以通过
data出参直接获取错误信息(建议优先使用此方式),也可以通过atrust_error_string接口获取对应的错误信息。由于历史原因,在服务端返回错误时,atrust_error_string获取的错误信息可能丢弃了服务端的动态参数信息,因此建议优先使用data出参获取错误信息。