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说明

  • 接口返回成功
    1. 接口返回成功则nextAuth出参非空,可根据nextAuth参数的取值,将data转换为对应的数据结构,其对应关系参考atrust_code.h
    2. 如果配置了第三方认证服务器,则可以通过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说明

  • 接口返回成功
    1. 接口返回成功则nextAuth出参非空,可根据nextAuth参数的取值,将data转换为对应的数据结构,其对应关系参考atrust_code.h
    2. 如果配置了第三方认证服务器,则可以通过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出参获取错误信息。

深信服科技 all right reserved,powered by Gitbook本文档更新于: 2024-07-25 22:26

results matching ""

    No results matching ""