Android SDK集成文档
<p>[TOC]</p>
<h1>概述</h1>
<p>本文是密认宝无感登录SDK_Android端接入文档,用于指导SDK的集成使用。在对接之前您需要花5-10分钟阅读新手教程和以下内容。</p>
<h1>前置条件</h1>
<ul>
<li>无感登录SDK支持minSdkVersion 16及以上版本</li>
</ul>
<h1>开发环境搭建</h1>
<h2>本地集成</h2>
<ul>
<li>将SDK中libs目录下的aar包拷贝到您工程的libs目录下,如没有该目录需新建。</li>
<li>在build文件的dependencies中添加aar包依赖
<pre><code>repositories {
flatDir {
dirs '../app/libs'
}
}
implementation (name:'authlibrary',ext:'aar')</code></pre>
<p><br/></p>
<h2>权限配置</h2>
<pre><code class="language-java">您需要在 AndroidMainfest.xml 文件添加:
&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; /&gt;</code></pre></li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left;">权限名称</th>
<th>权限说明</th>
<th>使用说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">INTERNET</td>
<td>允许应用程序联网</td>
<td>用于访问网关和认证服务器</td>
</tr>
<tr>
<td style="text-align: left;">ACCESS_WIFI_STATE</td>
<td>允许访问WiFi网络状态信息</td>
<td>允许程序访问WiFi网络状态信息</td>
</tr>
</tbody>
</table>
<h1>SDK的使用</h1>
<p>通过上面的几个步骤,工程就配置完成了,接下来就可以在工程中使用密认宝SDK进行开发了。</p>
<h2>混淆配置</h2>
<pre><code class="language-java">-keep class com.safevast.uid.** {*;}</code></pre>
<h2>初始化</h2>
<p>传入appId进行初始化,初始化成功之后即可使用SDK中的方法。
方法原型
AuthManager.getInstance().initAuth(context, appId, initListener);</p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">context</td>
<td>Context</td>
<td>传ApplicationContext对象</td>
</tr>
<tr>
<td style="text-align: left;">appId</td>
<td>String</td>
<td>应用appId</td>
</tr>
<tr>
<td style="text-align: left;">initListener</td>
<td>InitListener</td>
<td>初始化回调监听</td>
</tr>
</tbody>
</table>
<p>示例代码</p>
<pre><code class="language-java">AuthManager.getInstance().initAuth(getApplicationContext(), BuildConfig.APP_ID, new InitListener() {
@Override
public void initResult(int code, String result) {
if(code == 1000){
//初始化成功
}
}
});</code></pre>
<p>initResult(int code, String result)返回参数code和result,含义如下:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">字段</th>
<th>类型</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td>int</td>
<td>code为1000:成功;其他:失败</td>
</tr>
<tr>
<td style="text-align: left;">result</td>
<td>String</td>
<td>初始化结果描述</td>
</tr>
</tbody>
</table>
<h2>获取密钥因子</h2>
<p>获取密钥因子:无感登录失败后需要通过其他方式登录,同步获取密钥因子用于加密用户ID激活密码模块。
示例代码</p>
<pre><code class="language-java">String session = AuthManager.getInstance().getSessionSon(context);</code></pre>
<p>getSessionSon(context)返回参数session,含义如下:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">字段</th>
<th>类型</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">session</td>
<td>String</td>
<td>密钥因子</td>
</tr>
</tbody>
</table>
<h2>激活密码模块</h2>
<p>传入SM4加密的用户ID、用户名称、头像路径、自定义参数去激活密码模块
请确认初始化成功后再调用此方法。
示例代码</p>
<pre><code class="language-java">AuthManager.getInstance().quietlyActivation(SM4-USER-ID, &quot;USER-NAME&quot;, &quot;PHOTO-PATH&quot;, AUTO-PARAM, new QuietlyActivationListener() {
@Override
public void quietlyActivationResult(int code, String result) {
if(code == 1000){
//密码模块已激活
}
}
});</code></pre>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">SM4-USER-ID</td>
<td>String</td>
<td>SM4加密的用户ID</td>
</tr>
<tr>
<td style="text-align: left;">userName</td>
<td>String</td>
<td>用户名称</td>
</tr>
<tr>
<td style="text-align: left;">photoPath</td>
<td>String</td>
<td>头像路径</td>
</tr>
<tr>
<td style="text-align: left;">autoParam</td>
<td>Object</td>
<td>自定义参数</td>
</tr>
</tbody>
</table>
<p>SM4加密用户ID示例</p>
<pre><code class="language-java">//获取密钥因子
String sessionSon = AuthManager.getInstance().getSessionSon(context);
//sKey = 密钥因子+appKey
String sKey = AuthManager.getInstance().getMd5_16(sessionSon + appKey);
//加密USER_ID
String SM4-USER-ID = AuthManager.getInstance().sm4EncryptMsg(USER_ID,sKey.getBytes());</code></pre>
<p>quietlyActivationResult(int code, String result)返回参数code和result,含义如下:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">字段</th>
<th>类型</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td>int</td>
<td>code为1000:成功;其他:失败</td>
</tr>
<tr>
<td style="text-align: left;">result</td>
<td>String</td>
<td>激活密码模块结果描述</td>
</tr>
</tbody>
</table>
<h2>无感登录</h2>
<p>用户打开APP时,调用无感登录获取uToken、userName、photoPath、自定义参数、signature、apiVersion。
注意:正常情况下无感登录成功可以直接进入APP,如果是用户主动退出账号,无感登录成功需要显示用户头像、昵称提示用户确认。
示例代码</p>
<pre><code class="language-java">AuthManager.getInstance().quietlyAuth(new QuietlyListener() {
@Override
public void quietlyResult(int code, String result) {
if(code == 1000){
//无感认证成功
try {
JSONObject json = new JSONObject(result);
//uToken
String uToken = json.optString(&quot;uToken&quot;);
//userName
String userName = json.optString(&quot;userName&quot;);
//photoPath
String photoPath = json.optString(&quot;photoPath&quot;);
//自定义参数
String autoParam = json.optString(&quot;autoParam&quot;);
//签名信息
String signature = json.optString(&quot;signature&quot;);
//apiVersion
String apiVersion = json.optString(&quot;apiVersion&quot;);
} catch (JSONException e) {
e.printStackTrace();
}
}else if(code == 1012){
//无感认证失败,当前账户已在其他设备登录
}else{
//无感认证失败
}
}
});</code></pre>
<p>quietlyResult(int code, String result)返回参数code和result,含义如下:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">字段</th>
<th>类型</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td>int</td>
<td>code为1000:成功;1012:失败,当前账户已在其他设备登录;其他:失败</td>
</tr>
<tr>
<td style="text-align: left;">result</td>
<td>String</td>
<td>无感认证结果描述,成功会返回JSON数据,按示例解析即可</td>
</tr>
</tbody>
</table>
<h2>sm4加密方法</h2>
<p>请确保预认证成功后再调用此方法
示例代码</p>
<pre><code class="language-java">String sm4Vaule = AuthManager.getInstance().sm4EncryptMsg(vaule,sessionKey);</code></pre>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">vaule</td>
<td>String</td>
<td>需要加密的数据</td>
</tr>
<tr>
<td style="text-align: left;">sessionKey</td>
<td>byte[]</td>
<td>加密密钥</td>
</tr>
</tbody>
</table>
<p>sm4EncryptMsg((vaule,sessionKey)返回结果,含义如下:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">字段</th>
<th>类型</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">sm4Vaule</td>
<td>String</td>
<td>sm4加密后结果(16进制字符)</td>
</tr>
</tbody>
</table>
<h2>日志开关</h2>
<p>通过代码设置是否显示日志
示例代码</p>
<pre><code class="language-java">AuthManager.getInstance().showLog(boolean showLog);</code></pre>
<table>
<thead>
<tr>
<th style="text-align: left;">字段</th>
<th>类型</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">showLog</td>
<td>boolean</td>
<td>true:显示日志;false:不显示日志</td>
</tr>
</tbody>
</table>
<h2>SDK版本获取</h2>
<p>通过代码获取SDK版本号
示例代码</p>
<pre><code class="language-java">String version = AuthManager.getInstance().getVersion();</code></pre>
<table>
<thead>
<tr>
<th style="text-align: left;">字段</th>
<th>类型</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">version</td>
<td>String</td>
<td>返回版本号</td>
</tr>
</tbody>
</table>
<h2>返回码</h2>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">1000</td>
<td>所有请求返回1000即代表成功</td>
</tr>
<tr>
<td style="text-align: left;">1012</td>
<td>无感登录失败,当前账户已在其他设备登录</td>
</tr>
</tbody>
</table>
<p>其他返回码请结合result结果描述具体分析</p>