提供基于IoT Token的用戶身份認證方案,通過集成賬號及用戶SDK、API通道SDK,生成并管理用戶身份憑證,以及鑒權發起API請求的用戶身份。

依賴 SDK 概述
API通道 提供API通道能力
賬號及用戶SDK 提供賬號能力

初始化

初始化前需確保已集成安全圖片,初始化的操作請參見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字段查看