提供基于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字段查看 |