提供基于IoT Token的用戶身份認證方案,通過集成賬號及用戶SDK、API通道SDK,生成并管理用戶身份憑證,以及鑒權發起API請求的用戶身份。
依賴 SDK | 概述 |
---|---|
API通道 | 提供API通道能力 |
賬號及用戶SDK | 提供賬號能力 |
初始化
使用方式
當使用API通道執行某些需要IoT身份鑒權的業務請求時,統一身份認證SDK為API通道提供了一個自動完成請求認證信息填充的模塊IoTCredentialProviderImpl,使用方式如下。
- 構建需要鑒權的業務請求
構建IoTRequest時需要增加AuthType參數(初始化時已默認注冊為“iotAuth”) ,代碼如下所示。
IoTRequest request = new IoTRequestBuilder() .setPath("/kit/debug/ping") // 參考業務API文檔,設置path .setApiVersion("1.0.0") // 參考業務API文檔,設置API Version .addParam("request", paramMap) .setAuthType("iotAuth") //此處固定使用iotAuth .build();
- 處理認證失敗
目前服務端邏輯不支持同一個賬號多端登錄,如果一個賬號在多個設備登錄,那么只有最后一個登錄的賬號才可以正常訪問IoT服務,其他賬號則會返回認證錯誤,SDK提供一個接口,可以方便開發者隨時監聽這個錯誤,接口如下所示。
IoTCredentialManageImpl.getInstance(app).setIotTokenInvalidListener(IoTTokenInvalidListener listener)
其中IoTTokenInvalidListener定義如下。
public interface IoTTokenInvalidListener { void onIoTTokenInvalid(); }
說明 API全局只能設置一次,推薦在初始化完成之后,調用該API監聽IoT Token失效的情況。當onIotTokenInvalid被觸發時,需要提示C端用戶當前會話已失效,需要重新登錄。
獲取/刷新用戶憑證
獲取用戶認證數據代碼如下,如果結果返回NULL,可以調用異步刷新接口重新獲取。
IoTCredentialManage ioTCredentialManage = IoTCredentialManageImpl.getInstance(app);
if(ioTCredentialManage!=null){
ioTCredentialManage.getIoTCredential();
}
其中IotCredentialData常用字段解釋如下。
public class IoTCredentialData {
/**
* 臨時令牌,對請求做身份校驗
*/
public String iotToken;
/**
* iotToken創建時間,標準Unix時間戳
*/
public long iotTokenCreateTime;
/**
* iotToken失效時間 -- 時間與云端同步,單位為毫秒
*/
public long iotTokenExpireTime;
/**
* refreshToken ,用于刷新iotToken
*/
public String refreshToken;
/**
* refreshToken 創建時間,標準Unix時間戳
*/
public long refreshTokenCreateTime;
/**
* refreshToken失效時間 -- 時間與云端同步,單位為毫秒
*/
public long refreshTokenExpireTime;
/**
* IoT用戶唯一身份標識identityId
*/
public String identity;
}
刷新用戶認證數據代碼如下。
IoTCredentialManage ioTCredentialManage = IoTCredentialManageImpl.getInstance(app);
if (ioTCredentialManage != null) {
ioTCredentialManage.asyncRefreshIoTCredential(new IoTCredentialListener() {
@Override
public void onRefreshIoTCredentialSuccess(IoTCredentialData ioTCredentialData) {
Log.i(TAG, "refresh IoTCredentailData success :" + ioTCredentialData.toString());
}
@Override
public void onRefreshIoTCredentialFailed(IoTCredentialManageError ioTCredentialManageError) {
Log.i(TAG, "refresh IoTCredentailData failed ");
if (ioTCredentialManageError != null) {
Log.i(TAG, "error code is:" + ioTCredentialManageError.errorCode);
}
}
});
}
混淆配置
在proguard-rules.pro文件中,加入以下代碼,排除不需要被混淆的類和方法。
-keep public class com.aliyun.iot.aep.sdk.credential** {
public <methods>;
public <fields>;
}
常見錯誤碼含義
錯誤碼 | 含義 |
---|---|
0 | 賬號未登錄 |
1 | 賬號類型錯誤 |
2 | 賬號AuthCode無效(即Session失效) |
3 | refreshToken過期,需要重新登錄 |
4 | 服務器相應的報文格式錯誤(請將request和response提工單) |
5 | 賬號AuthCode校驗錯誤 |
-1 | 其他錯誤,請查看APIClient返回的具體業務錯誤或者通過detail字段查看 |