身份认证 SDK
更新时间:2019-01-14 15:19:07
提供基于 iotToken 的用户身份认证方案,通过和账号 SDK、API 通道 SDK 的集成,完成用户身份凭证的生成和管理,以及发起 API 请求的用户身份的鉴权。
1.1 初始化
身份认证SDK的初始化,必须在账号SDK初始化之后
SDK(com.aliyun.iot.aep.sdk:iot-credential)版本小于0.0.1.7,初始化接口定义如下:
/**
* 初始化IoTCredentialManageImpl
*
* @param loginAdapter 实现统一登录抽象接口,不可以为NULL
* @param appKey 平台注册的APPKEY
*/
public static void init(ILoginAdapter loginAdapter, String appKey);
//常用初始化代码片段:
OALoginAdapter loginAdapter = new OALoginAdapter(context);
IoTCredentialManageImpl.init(loginAdapter, appkey);
SDK(com.aliyun.iot.aep.sdk:iot-credential)版本为0.0.1.7以及以上,初始化接口定义如下:
/**
* 初始化IoTCredentialManageImpl
*
* @param loginAdapter 实现统一登录抽象接口,不可以为NULL
* @param appKey 平台注册的APPKEY
*/
public static void init(String appKey);
//常用初始化代码片段:
IoTCredentialManageImpl.init(appKey);
1.2 使用方式
当使用 API 通道 执行某些需要IoT身份鉴权的业务请求时,统一身份认证 SDK 为 API 通道提供了一个自动完成请求认证信息填充的模块 IoTCredentialProviderImpl,使用方式如下:
初始化IoTCredentialHook模块代码如下:
IoTAuthProvider provider = new IoTCredentialProviderImpl(IoTCredentialManageImpl.getInstance(app)); IoTAPIClientImpl.getInstance().registerIoTAuthProvider("iotAuth", provider);
构建需要鉴权的业务请求 IoTRequest
构建 IoTRequest 时需要增加 AuthType 参数(参数填写注册 IoTCredentialHook 时,注册的 key,本例为“iotAuth”) ,代码如下所示:
IoTRequest request = new IoTRequestBuilder()
.setPath("path")
.setApiVersion("1.0.4")
.addParam("request", paramMap)
.setAuthType("iotAuth")
.build();
在 API 通道内部会触发 IoTCredentialProviderImpl ,自动刷新并填充认证信息,完成正常的业务请求。
1.3 其他功能说明:
* 获取用户凭证(iotToken)
获取用户认证数据代码片段如下,如果结果返回NULL,可以调用异步刷新接口重新获取
IoTCredentialManage ioTCredentialManage = IoTCredentialManageImpl.getInstance(app);
if(ioTCredentialManage!=null){
ioTCredentialManage.getIoTCredential();
}
* 刷新用户凭证(iotToken)
刷新用户认证数据代码片段如下:
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);
}
}
});
}
1.4 混淆配置:
-keep public class com.aliyun.iot.aep.sdk.credential** {
public <methods>;
public <fields>;
}
常见问题说明:
问题1 : 执行登录或者注册时,提示“亲,您的手机网络不太顺畅哦~”
排查步骤:
确认安全图片是否在src/drawable目录下,如果在在初始化代码中设置了图片后缀为“114d”,请务必保证安全图片的名称为yw_1222_114d;
//设置图片后缀ConfigManager.getInstance().setSecGuardImagePostfix("114d");
确认初始化中是否有抛出异常
- 其中ErrorCode=110的异常码可以忽略
- 以下几种Warn可以忽略(用来检查社交账号SDK)
- 其中ErrorCode=110的异常码可以忽略
W/oa_Oauth: [] : Umeng is not available, Umeng Oauth Service Provider is disabled W/oa_Oauth: [] : Taobao MemberSDK is not available, Taobao 3rd Oauth Service Provider is disabled W/oa_Oauth: [] : Taobao login4android SDK is not available, Taobao 2nd Oauth Service Provider is disabled W/oa_Oauth: [] : Alipay sdk is not available, Alipay Oauth Service Provider is disabled
如果是用Demo中提供的OALoginAdapter,下面异常日志可以忽略
java.lang.NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object referenceat com.aliyun.iot.aep.sdk.login.oa.OALoginAdapter.a(OALoginAdapter.java:343)
问题2 : 无法打开登录页面
排查步骤:
- 确认日志中是否有以下异常输出
init failed code = 10010 message = 发生错误,消息为 null, 请使用 LogCat 查看更多细节 或者 Failed resolution of: Lcom/ut/mini/UTHitBuilders@UTCustomHitBuilder
说明主工程缺少UT SDK的依赖,请在主工程里增加如下两个依赖,或者在平台上重新下载SDK依赖文件:
compile 'com.aliyun.ams:alicloud-android-utdid:1.1.5.4' compile 'com.aliyun.ams:alicloud-android-ut:5.1.0'
问题3:无法正常获取iotToken,或者调用接口时返回认证错误
排查步骤: 请根据接口返回的异常信息(例如errorCode的值)判断,错误码定义如下:
/**
* 账号未登录,需要登录
*/
public static final int RESULT_CODE_NOT_LOGIN = 0;
/**
* 账号类型错误, accountType 需要和一站式开发平台配置保持一致
*/
public static final int RESULT_CODE_ACCOUNT_TYPE_INVALID = 1;
/**
* 账号 authCode 无效
*/
public static final int RESULT_CODE_AUTHCODE_INVALID = 2;
/**
* 服务器返回 refreshToken 过期或无效,需要重新登录
*/
public static final int RESULT_CODE_REFRESHTOKEN_INVALID = 3;
/**
* 服务器响应的报文格式异常 ,请提工单
*/
public static final int RESULT_CODE_WRONG_RESPONSE_FORMAT = 4;
/**
* 账号 authCode 校验失败,如果重新登录再请求还报同样的错误码,请提工单
*/
public static final int RESULT_CODE_AUTHCODE_CHECK_FAILED = 5;
/**
* 其他错误,如,网络错误或服务器返回的错误,会把原始错误信息通过 userInfo.detail 透传
*/
public static final int RESULT_CODE_OHTER = -1;
问题4 : 刷新IoTToken一直提示错误
排查步骤:
确认是否有同一个账号多端登录,目前的认证系统不支持同一个账号多端登录,后登录的设备会将之前登录的设备踢掉,表现为:刷新IoTToken一直失败,返回错误码为3,详情请参考问题3的错误码描述。
确认是否登录,确认在实现ILoginAdapter时,是否有实现refreshSession接口(当登录态失效时,身份认证SDK会调用ILoginAdapter.refreshSession来刷新)。
其他错误码请参考问题3