Customer Identity (CIAM)

Password Login

# Documentation Description

This document explains how to integrate password login functionality into an Android client.

# Process Description

# Login Process

Integration Process Description

  1. The user enters username + password / phone number + password / email + password and clicks the login button.

  2. The APP client calls the login method (4 types).

  3. The IDaaS SDK calls the IDaaS server for authentication. The authentication results are divided into four types (success, password about to expire, password expired, failure).

  4. In case of success, the IDaaS server returns a session_token.

  5. The IDaaS SDK returns the session_token to the APP client.

  6. If the password is about to expire, the IDaaS server returns a parameter indicating the password is about to expire.

  7. The IDaaS SDK returns the "password about to expire" status to the APP client.

  8. The user can choose to skip changing the password or change the password directly.

  9. Based on the user's button click, the APP client calls the method to skip password change or the method to change the password.

  10. The IDaaS SDK calls the IDaaS server's skip password change interface or the change password interface.

  11. The IDaaS server validates and returns a session_token upon success, or an error code upon failure.

  12. The IDaaS SDK returns the success/failure parameters to the APP client.

  13. If the password has already expired, the IDaaS server returns a parameter to the IDaaS SDK forcing a password change.

  14. The IDaaS SDK returns the forced password change parameter to the client APP.

  15. The user is forced to change the password. The APP client calls the password change method.

  16. The IDaaS SDK calls the IDaaS server's password change interface.

  17. The IDaaS server returns a session_token to the IDaaS SDK upon successful password change / returns an error code upon password change failure.

  18. The IDaaS SDK returns the session_token to the APP client upon successful password change / returns an error code upon password change failure.

# Password Recovery Process

Integration Process Description

  1. User clicks the "Forgot Password" button.

  2. The APP client displays the password recovery page, which must be provided by the APP itself.

  3. The user enters a phone number and clicks the "Get Verification Code" button.

  4. The APP calls the slider verification method.

  5. The IDaaS SDK requests the IDaaS server's slider verification interface.

  6. The IDaaS server returns slider verification parameters.

  7. The IDaaS SDK launches and displays the slider verification window.

  8. The user drags the slider for verification.

  9. The IDaaS SDK sends the slider verification result to the IDaaS server.

  10. The IDaaS server returns the slider verification result.

  11. The IDaaS SDK returns the slider verification result to the APP client.

  12. The APP client uses the slider token to call the IDaaS SDK's method for sending an SMS verification code.

  13. The IDaaS SDK calls the IDaaS server's interface for sending verification codes.

  14. The IDaaS server returns the result of sending the verification code to the IDaaS SDK.

  15. The IDaaS SDK returns the result of sending the verification code to the APP client.

  16. The user receives the SMS verification code, enters it, and clicks the "Recover Password" button.

  17. The APP client calls the IDaaS SDK's password recovery method using the phone number + verification code + new password.

  18. The IDaaS SDK calls the IDaaS server's password recovery interface.

  19. The IDaaS server returns the password recovery result to the IDaaS SDK.

  20. The IDaaS SDK returns the password recovery result to the APP client.

# Environment Setup

# Get clientID

Log in to the IDaaS Enterprise Center platform, click "Resources -> Applications", select the relevant application, and click to view it.

# Password Policy Settings

This setting is for configuring password expiration time and reminder duration.

First, navigate to the password policy module following the path shown in the diagram below.

Under Password Expiration, you can enable:

After enabling this feature, you can set how long the password expires and the number of days for advance notification as shown in the figure below.

This setting is for the IDaaS server to detect how long the password currently used for login needs to be changed after login, and to prompt the user to change it a few days in advance. Once password expiration check is enabled, it will be performed according to the configured parameters during each login.

# Import Dependencies

No third-party SDK dependencies

# Configure build.gradle

/*begin*/
    /*  rxjava2 +  okhttp + retrofit2  */
    api 'io.reactivex.rxjava2:rxjava:2.2.10'
    api 'io.reactivex.rxjava2:rxandroid:2.1.1'
    api 'com.squareup.retrofit2:retrofit:2.6.0'
    api 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'
    api 'com.squareup.retrofit2:converter-gson:2.6.0'
    api 'com.squareup.okhttp3:okhttp:4.3.1'
    api 'com.squareup.okhttp3:logging-interceptor:3.6.0'
    api 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    api 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
    api 'com.alibaba:fastjson:1.2.61'
     /*end*/
        
    //Common library, required
    implementation(name: 'AuthnCenter_Common-1.5.3', ext: 'aar')
    //Password login SDK, required
    implementation(name: ''AuthnCenter_PWDLogin-1.5.3', ext: 'aar')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# Configure AndroidManifest

 <!--Permissions-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEM"/>
1
2
3
4
5
6
7
8

# Initialization

AuthnCenterSDK.Builder().init(this)
        .setBaseUrl("https://xxx.idaas-xxxx.bccastle.com") //IDaaS application secondary domain
        .setClientId(zlgV9yb7CsHqaPOlsPad70S9EyEIHw7j")  //Applied application clientId
        .isCheckSSL(true)  //Enable SSL verification. Recommended to enable for https.
        .logEnable(true)  //Recommended to enable during integration phase, disable after launch.
        .build();
1
2
3
4
5
6

# Development Integration

# Built-in API Introduction

Brief introduction to the main class AuthnCenterAPI for basic configuration initialization:

/**
 * SMS Verification Code -- Send SMS
 */
public void smsSend(Context context, SendSmsReq req, RequestListener listener)

/**
 * Get Country Code    Note: If country code configuration is required, call this interface to obtain the country code.
 */
public void getCountryCode(Context context, RequestListener listener)
1
2
3
4
5
6
7
8
9

Introduction to the main class AuthnCenterPWDLogin methods for password login initialization:

/**
 * Username and password login
 *
 * @param context context
 * @param userName  username
 * @param password   password
 * @param loginListener  event callback
 */
public void userLoginRequest(Context context, String userName, String password, PWLoginListener loginListener)

/**
 * Unified user password login
 *   Supports username+password, phone number+password, and email+password simultaneously.
 * @param context context
 * @param userName  username
 * @param password   password
 * @param loginListener  event callback
 */
public void userLoginAuthRequest(Context context, String userName, String password, PWLoginListener loginListener)

/**
 * Phone number + password
 *
 * @param context context
 * @param mobile  phone number
 * @param password   password
 * @param loginListener  event callback
 */
public void userLoginMobilePwd(Context context, String mobile, String password, PWLoginListener loginListener)

/**
 * Email + password
 *
 * @param context context
 * @param email   email
 * @param password   password
 * @param loginListener  event callback
 */
public void userLoginEmailPwd(Context context, String email, String password, PWLoginListener loginListener)

/**
 * SMS registration
 *
 * @param context context
 * @param userInfoReq  registration user entity
 * @param loginListener  event callback
 */
public void userRegister(Context context, UserInfoReq userInfoReq, PWLoginListener loginListener)

/**
 * Retrieve password
 *
 * @param context context
 * @param findPwdReq   retrieve password entity
 * @param loginListener  event callback
 */
public void findPwd(Context context, FindPwdReq findPwdReq, PWLoginListener loginListener)

/**
 * Skip password change
 *
 * @param context context
 * @param stateToken stateToken
 * @param loginListener  event callback
 */
public void skipPwd(Context context, String stateToken, PWLoginListener loginListener)

/**
 * Force password change
 *
 * @param context context
 * @param pwdReq    change password entity
 * @param stateToken stateToken
 * @param loginListener  event callback
 */
public void updatePwd(Context context, UpdatePwdReq pwdReq, String stateToken, PWLoginListener loginListener)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

The PWLoginListener returns different CODEs during the login API callback. For different application scenarios, the integrator needs to make their own judgments and handle related business logic accordingly.

Currently, only the following codes are returned for passwords that are about to expire or have already expired. Please refer to the integration DEMO for specific details.

Code Built-in Enum Value Description
10006 SDKCodeType.SDK_PASSWORD_EXPIRED.getCode() Password has expired
10007 SDKCodeType.SDK_PASSWORD_WARN.getCode() Password is about to expire

# Obtaining Mobile International Dialing Codes

If international number support is enabled, please first call the international dialing code retrieval interface. This interface returns a configured list of international dialing codes along with regular expressions for phone numbers. The image below shows how to configure the international dialing code list and the preferred dialing code.

Example code for obtaining the international dialing code list:

AuthnCenterAPI.Builder().getCountryCode(this, new RequestListener<CountryCodeInfoRsp>() {
    @Override
    public void success(CountryCodeInfoRsp codeInfoRsp) {
  
    }

    @Override
    public void error(String code, String errorMessage) {
    }
});
1
2
3
4
5
6
7
8
9
10

Example of a successful response with code=0, data value:

{
	"phoneAreaCodeDefinitions": [
		{
			"areaCode": "86",
			"displayMapping": {
				"zh-TW": "中國大陸",
				"en": "China",
				"zh-CN": "中国大陆"
			},
			"countryCode": "CN",
			"mobileRegex": "^(\\+86){0,1}\\-?1\\d{10}$",
			"areaCodeSuffixes": []
		},
		{
			"areaCode": "852",
			"displayMapping": {
				"zh-TW": "中國香港",
				"en": "Hong Kong",
				"zh-CN": "中国香港"
			},
			"countryCode": "HK",
			"mobileRegex": "^(\\+852){1}\\-?0{0,1}[1,4,5,6,7,8,9](?:\\d{7}|\\d{8}|\\d{12})$",
			"areaCodeSuffixes": []
		},
		{
			"areaCode": "886",
			"displayMapping": {
				"zh-TW": "中國臺灣",
				"en": "Taiwan",
				"zh-CN": "中国台湾"
			},
			"countryCode": "TW",
			"mobileRegex": "^(\\+886){1}\\-?[6,7,9](?:\\d{7}|\\d{8})$",
			"areaCodeSuffixes": []
		},
		{
			"areaCode": "853",
			"displayMapping": {
				"zh-TW": "中國澳門",
				"en": "Macau",
				"zh-CN": "中国澳门"
			},
			"countryCode": "MO",
			"mobileRegex": "^(\\+853){1}\\-?0{0,1}[1,4,5,6,7,8,9](?:\\d{7}|\\d{8}|\\d{12})$",
			"areaCodeSuffixes": []
		},
		{
			"areaCode": "93",
			"displayMapping": {
				"zh-TW": "阿富汗",
				"en": "Afghanistan",
				"zh-CN": "阿富汗"
			},
			"countryCode": "AF",
			"mobileRegex": "^(\\+93){1}\\-\\d{6,11}",
			"areaCodeSuffixes": []
		}
	],
	"preferredAreaCode": "CN"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

Return Parameters:

Parameter Name Chinese Name Type Description
preferredAreaCode Preferred International Dialing Code String The preferred international dialing code configured for the current enterprise center
countryCode Country/Region Code String Country/Region Code
areaCode International Telephone Area Code String International Telephone Area Code
areaCodeSuffixes International Telephone Area Code Suffixes String International Telephone Area Code Suffixes
mobileRegex Mobile Number Format Regular Expression String Mobile Number Format Regular Expression
displayMapping Multi-language Display Name Mapping String Multi-language Display Name Mapping

# Built-in Sliding Verification

Human-machine interaction verification is required when sending verification codes:


BlockPuzzleDialog mBlockPuzzleDialog = new BlockPuzzleDialog(mContext);
mBlockPuzzleDialog.setOnResultsListener(new OnResultsListener() {
        @Override
        public void onResultsClick(String result) {
            LogUtil.getInstance().d("Secondary verification callback result mCaptchaToken:" + result);
            // This callback result is the captchaToken parameter for SMS verification
        }
        @Override
        public void onError(String code, String msg) {
            ToastUtils.ShowToast(mContext, String.format("Error Code: %s  Error Message: %s", code, msg));
        }
    });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# Username and Password Login

AuthnCenterPW.Builder().userLoginRequest(this, name, pwd, new PWLoginListener<LoginRsp>() {
    @Override
    public void success(String code, LoginRsp rsp) {
        loginRsp = rsp;
        if (code.equals(SDKCodeType.SDK_SUCCESS.getCode())) {
            ToastUtils.ShowToast(MainActivity.this, "Login successful, returned data is:" + rsp.getSession_token());
            return;
        }
        onNext(code); // Determine if the password has expired based on the return value. Refer to the returned CODE for judgment. 10006: Password expired, 10007: Password about to expire. Developers can refer to the DEMO's onNext method.
    }
    @Override
    public void error(String code, String t) {
        ToastUtils.ShowToast(MainActivity.this, "Login failed, returned data is:" + t);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# Mobile Number and Password Login

AuthnCenterPW.Builder().userLoginMobilePwd(this, name, pwd, new  PWLoginListener<LoginRsp>() {
    @Override
    public void success(String code, LoginRsp rsp) {
        loginRsp = rsp;
        if (code.equals(SDKCodeType.SDK_SUCCESS.getCode())) {
            ToastUtils.ShowToast(MainActivity.this, "Login successful, returned data is:" + rsp.getSession_token());
            return;
        }
        onNext(code);
    }
    @Override
    public void error(String code, String t) {
        ToastUtils.ShowToast(MainActivity.this, "Login failed, returned data is:" + t);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# Email and Password Login

AuthnCenterPW.Builder().userLoginEmailPwd(this, name, pwd, new PWLoginListener<LoginRsp>() {
    
    @Override
    public void success(String code, LoginRsp rsp) {
        loginRsp = rsp;
        if (code.equals(SDKCodeType.SDK_SUCCESS.getCode())) {
            ToastUtils.ShowToast(MainActivity.this, "Login successful, returned data is:" + rsp.getSession_token());
            return;
        }
        onNext(code);
    }
    @Override
    public void error(String code, String t) {
        ToastUtils.ShowToast(MainActivity.this, "Login failed, returned data is:" + t);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# Unified Username and Password Login

AuthnCenterPW.Builder().userLoginAuthRequest(this, name, pwd, new  PWLoginListener<LoginRsp>() {
    @Override
    public void success(String code, LoginRsp rsp) {
        loginRsp = rsp;
        if (code.equals(SDKCodeType.SDK_SUCCESS.getCode())) {
            ToastUtils.ShowToast(MainActivity.this, "Login successful, returned data is:" + rsp.getSession_token());
            return;
        }
        onNext(code); // Determine if the password has expired based on the return value. Refer to the returned CODE for judgment. 10006: Password expired, 10007: Password about to expire.

    }
    @Override
    public void error(String code, String t) {
        ToastUtils.ShowToast(MainActivity.this, "Login failed, returned data is:" + t);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# Skip Password Modification


AuthnCenterPW.Builder().skipPwd(MainActivity.this, loginRsp.getState_token(), new PWLoginListener<LoginRsp>() {
    @Override
    public void success(String code, LoginRsp rsp) {
        loginRsp = rsp;
        ToastUtils.ShowToast(MainActivity.this, "Skip modification successful. Returned data: " + rsp.getSession_token());
    }
    @Override
    public void error(String code, String t) {
        ToastUtils.ShowToast(MainActivity.this, "Skip modification failed. Returned data: " + t);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12

# Force Password Change

UpdatePwdReq up = new UpdatePwdReq();
up.setOld_password(oldPwd);
up.setNew_password(newPwd);
AuthnCenterPW.Builder().updatePwd(MainActivity.this, up, loginRsp.getState_token(), new PWLoginListener<LoginRsp>() {
    @Override
    public void success(String code, LoginRsp rsp) {
        loginRsp = rsp;
        ToastUtils.ShowToast(MainActivity.this, "Force change successful. Returned data: " + rsp.getSession_token());
    }
    @Override
    public void error(String code, String t) {
        ToastUtils.ShowToast(MainActivity.this, "Force change failed. Returned data: " + t);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# SMS Registration

UserInfoReq ur = new UserInfoReq();
ur.setUser_name(et_name.getText().toString().replace(" ", ""));
ur.setPwd(et_new_pwd.getText().toString().replace(" ", ""));
ur.setMobile(moblie);
ur.setVerify_code(verifyCode);
ur.setAttr_birthday(et_new_birthday.getText().toString().replace(" ", ""));
ur.setName("Test One");
ur.setAttr_nick_name("Test Alias");
ur.setMailing_address("Test Address");
ur.setZip_code("430000");
ur.setAttr_gender(SexType.MALE.getSex()); //Gender enumeration
ur.setEmail("111@111.com");
ur.setFirst_name("Test First_name");
ur.setLast_name("Test Last_name");
ur.setIndustry("Test Industry");
ur.setHead_img("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
TestExtensionBean tb = new TestExtensionBean();
tb.setAge(12);
ur.setExtension(tb);
AuthnCenterPW.Builder().userRegister(RegisterActivity.this, ur, new PWLoginListener<LoginRsp>() {
    @Override
    public void success(String code, LoginRsp rsp) {
        if (code.equals(SDKCodeType.SDK_SUCCESS.getCode()))
            ToastUtils.ShowToast(RegisterActivity.this, "Registration successful: " + rsp.getSession_token());
    }
    @Override
    public void error(String code, String t) {
        ToastUtils.ShowToast(RegisterActivity.this, "Registration failed: " + t);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

UserInfoReq SMS Registration Entity Field Explanations:

Parameter Name Chinese Name Required Type Description
user_name Username No String
name Name No String
mobile Mobile Number Yes String
verify_code SMS Verification Code Yes String
email Email No String
pwd Password No String
head_img Avatar (URL) No String
attr_gender Gender No String Optional values: female; male; unknow: Confidential
attr_birthday Birthday No String Format: yyyy-MM-dd
attr_nick_name Nickname No String
mailing_address Mailing Address No String
zip_code Postal Code No String
first_name First Name No String
middle_name Middle Name No String
last_name Last Name No String
industry Industry No String
extension Extended Attributes No JSONObject Extended attributes must be defined within the enterprise

# Return Codes

Status Code Error Code (error_code) Error Description (error_msg) Action
400 IDAAS.SDK.COMMON.1001 Parameter {0} cannot be left blank
Parameter {0} cannot be empty
400 IDAAS.SDK.COMMON.1002 The {0} parameter format is incorrect
Parameter {0} format is incorrect
400 IDAAS.SDK.COMMON.1003 Device information is incomplete
Device information is incomplete
400 IDAAS.SDK.COMMON.1004 Signature decryption error
Signature decryption error
400 IDAAS.SDK.COMMON.1005 The {0} has failed
{0} has expired
400 IDAAS.SDK.COMMON.1006 The {0} parameter error
{0} parameter error
400 IDAAS.SDK.COMMON.1007 The {0} parameter type error
{0} parameter type error
500 IDAAS.SDK.COMMON.1008 The system is busy. Try again later
System busy. Please try again later
400 IDAAS.SDK.COMMON.1009 Unknown authentication configuration
Unknown authentication configuration
400 IDAAS.SDK.COMMON.1010 Failed to obtain the enterprise center global configuration
Failed to obtain enterprise center global configuration
400 IDAAS.SDK.COMMON.1011 Failed to obtain the international area code configuration
Failed to obtain international area code configuration
400 IDAAS.SDK.COMMON.1012 The x-client-ID is incorrect and the corresponding application cannot be found
X-client-id error, cannot find the corresponding application
400 IDAAS.SDK.COMMON.1013 The corresponding user is not found
Corresponding user not found
400 IDAAS.SDK.COMMON.1014 Application private key not found
Application private key not found
400 IDAAS.SDK.LOGIN.1001 Error calling interface {0}
Error calling interface {0}
400 IDAAS.SDK.LOGIN.1002 User not bound
User not bound
400 IDAAS.SDK.LOGIN.1003 The user has been locked due to too many unsuccessful login attempts. It will be unlocked in {0} minutes and {1} seconds
The user has been locked due to multiple failed login attempts. It will be unlocked in {0} minutes and {1} seconds
400 IDAAS.SDK.LOGIN.1004 Failed to obtain the password policy
Failed to obtain password policy
400 IDAAS.SDK.LOGIN.1005 Invalid username or password. Remaining login attempts: {0}
Invalid username or password. Remaining login attempts: {0}
400 IDAAS.SDK.LOGIN.1006 Configuration error, unable to find wechat authentication source
Configuration error, unable to find WeChat authentication source
400 IDAAS.SDK.LOGIN.1007 Configuration error, unable to find alipay authentication source
Configuration error, unable to find Alipay authentication source
400 IDAAS.SDK.LOGIN.1008 The configuration is incorrect. The one-click login authentication source cannot be found
Configuration error, unable to find one-click login authentication source
400 IDAAS.SDK.SMS.1001 {0} slide base map is not initialized successfully, please check the path
{0} slide base map not initialized successfully, please check the path
400 IDAAS.SDK.SMS.1002 {0} verification code coordinate resolution failed
{0} verification code coordinate resolution failed
400 IDAAS.SDK.SMS.1003 {0} verification code coordinate verification fails
{0} verification code coordinate verification failed
400 IDAAS.SDK.SMS.1004 The graphic verification code is incorrect
Graphic verification code verification error
400 IDAAS.SDK.SMS.1005 SMS verification code verification is incorrect
SMS verification code verification error
400 IDAAS.SDK.SMS.1006 The email verification code is incorrect
Email verification code verification error
400 IDAAS.SDK.SMS.1007 Sending scenario does not exist
Sending scenario does not exist
400 IDAAS.SDK.SMS.1008 Failed to send the verification code
Failed to send verification code
400 IDAAS.SDK.SOCIAL.1001 The social account is unbound incorrectly
Social account unbinding error
400 IDAAS.SDK.SOCIAL.1002 The social account has been bound, please unbind it first
Social account already bound, please unbind first
400 IDAAS.SDK.PWD.1001 The password length is incorrect
Password length error
400 IDAAS.SDK.PWD.1002 The password cannot be the username
Password cannot be the username
400 IDAAS.SDK.PWD.1003 Your password complexity is low
Your password complexity is low
400 IDAAS.SDK.PWD.1004 The password is weak
Password is weak
400 IDAAS.SDK.PWD.1005 The password is used before, cannot be used again
This password has been used before and cannot be used again
400 IDAAS.SDK.PWD.1006 Password cannot username in reverse order
Password cannot be the username in reverse order
400 IDAAS.SDK.PWD.1007 The number of repeated password characters exceeded the upper limit
Number of repeated password characters exceeds the limit
400 IDAAS.SDK.PWD.1008 Password cannot contain :username, phone number, email prefix, name in PinYing
Password cannot contain: username, phone number, email prefix, name in Pinyin
400 IDAAS.SDK.MFA.1001 The mobile doesn't match the user
Phone number does not match the user
400 IDAAS.SDK.MFA.1002 The access control policy is incorrect
Access control policy configuration error
400 IDAAS.SDK.MFA.1003 Access control authentication source type conversion error
Access control authentication source type conversion error

Please provide the Markdown content you need translated.