概述与资源

OneLogin Android SDK提供给集成Android原生客户端开发的开发者使用。

环境需求

条目 资源
开发目标 4.0以上
开发环境 Android Studio 2.1.3
系统依赖 v7包
sdk三方依赖 com.cmic.sso.sdkcom.unicom.xiaowo.logincn.com.chinatelecom.account.api

相关开发资料

条目 资源
产品结构流程 交互流程, 通讯流程
接口文档 onelogin-android-api-docs
错误码 Error Code 列表

安装

远程依赖

implementation 'com.geetest:onelogin:0.8.1'

获取 SDK 及 Demo

点击下载

导入 SDK 到项目工程并配置开发环境

  1. 在 Demo 的libs包下,将获取的.aar文件拖拽到工程中的 libs 文件夹下。

  2. 在拖入.aar到 libs 文件夹后, 还要检查.aar是否被添加到Library,要在项目的build.gradle下添加如下代码:

    repositories {
    flatDir {
    dirs 'libs'
    }
    }
  3. 手动将aar包添加依赖:

    compile(name: 'geetest_onelogin_android_vx.y.z', ext: 'aar')
  4. 添加权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.GET_TASKS" />
  5. 配置授权页activity。注意:0.8.0之后,只需配置两个activity即可。

    <!-- oneLogin -->
    <activity
    android:name="com.geetest.onelogin.activity.OneLoginActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:launchMode="singleTop"
    android:screenOrientation="behind" />
    <!-- oneLogin Web-->
    <activity
    android:name="com.geetest.onelogin.activity.OneLoginWebActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:launchMode="singleTop"
    android:screenOrientation="behind" />
  6. 配置http协议

方式一:

android:usesCleartextTraffic="true"

示例代码:

<application
android:usesCleartextTraffic="true"
></application>

方式二:在res文件夹下创建一个xml文件夹,然后创建一个network_security_config.xml文件,文件内容如下

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>

示例代码:

<application
android:networkSecurityConfig="@xml/network_security_config"
></application>

方式三:

目前运营商个别接口为http请求,对于全局禁用Http的项目,需要设置Http白名单。
以下为运营商http接口域名和ip名单:cmpassport.com、id6.me、mdn.open.wo.cn

配置接口

开发者集成客户端 SDK 前, 必须先在您的服务器上搭建相应的服务端获取登录信息的接口,并配置从极验后台获取的AppID。这里以服务端配置成功,客户端开发步骤为例,如下:

  1. 配置初始化接口

    //`OneLogin`的授权页面将与此处配置的`Activity`绑定
    OneLoginHelper.with().init(MainActivity.this);
  2. 设置调用界面的横竖屏,可以自主设置,也可以由sdk设置

    //第一个参数为当前页面
    //第二个参数为是否是竖屏
    OneLoginHelper.with().setRequestedOrientation(MainActivity.this,false);
  3. 调用预取号接口

    //第一个参数为所需要配置的App_ID
    //第二个参数为设置的超时时间
    //第三个参数为所需实现监听回调结果接口
    OneLoginHelper.with().preGetToken(appID,timeout,oneLoginListener);
  4. 调用取号接口

    //第一个参数为自定义的全局配置接口
    //第二个参数为所需实现监听回调结果接口
    OneLoginHelper.with().requestToken(oneLoginThemeConfig,oneLoginListener);

集成代码参考下方的代码示例。更进一步的示例, 见相关 Demo。

代码示例

初始化与校验

初始化

在项目的具体页面的onCreate方法里面进行初始化。使用OneLogin授权页面将与此处配置的Activity绑定。

OneLoginHelper.with().init(MainActivity.this);

配置当前页面是否横竖屏

OneLoginHelper.with().setRequestedOrientation(MainActivity.this,false);

预取号

OneLoginHelper.with().preGetToken(app_id,timeout,oneLoginListener);;

取号

OneLoginHelper.with().preGetToken(App_ID, 5000, new AbstractOneLoginListener() {
@Override
public void onResult(JSONObject jsonObject) {
try {
int status = jsonObject.getInt("status");
if (status == 200) {
//预取号成功
} else {
Toast.makeText(getApplicationContext(), jsonObject.toString(), Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});

获取免密登录 token 并使用 token 获取用户登录信息

获取 token 后, 通过接口进行校验, 并获取登录信息。

OneLoginHelper.with().requestToken(new OneLoginThemeConfig.Builder().build(), new AbstractOneLoginListener() {
@Override
public void onResult(JSONObject jsonObject) {
try {
int statusResult = jsonObject.getInt("status");
if (statusResult == 200) {
new Thread(new Runnable() {
@Override
public void run() {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("process_id", jsonObject.getString("process_id"));
jsonObject.put("token", jsonObject.getString("token"));
jsonObject.put("authcode", jsonObject.optString("authcode"));
} catch (JSONException e) {
e.printStackTrace();
}
String result = HttpUtils.requestNetwork(<---获取用户登录信息的接口--->, jsonObject);
}
}).start();
} else {
Toast.makeText(getApplicationContext(), jsonObject.toString(), Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});

关闭授权页

在关闭授权页的时候执行此方法。

OneLoginHelper.with().quitAuthActivity();

常见问题

1. 全机型,全系统兼容吗?

答:本产品只兼容4.0以上系统。

2. Demo的运行有什么注意问题?

答:需要申请对应的app_id,并需配置相应的服务接口。这样,Demo就可以正常使用了。

3. 预取号的时机?

答:在页面的初始化时,或者app初始化的时候。请注意,预取号的超时时间建议设置在5S左右。

4. 只有一个回调,该怎样处理页面切换等逻辑呢?

答:页面的所有状态都有错误码输出,可以根据错误码来实现。

5. 怎样控制关闭授权页的时机?

答:在requestToken()方法执行完成之后,根据错误码来自主实现关闭授权页的时机,当请求成功之后需要页面跳转的时候是关闭授权页的时机。开发者自定义控件的事件发生时也是关闭授权页的时机。

6. 授权页面的沉浸式状态栏或者设置状态栏的颜色怎么实现呢?

答:在0.6.1版本之后,可以通过setStatusBar方法设置。

7. OneLogin与OnePass一起使用包冲突错误怎么解决?

答:在OnePass的demo中有具体的脚本实现,详见OnePass项目。

8. 怎样实现横屏呢?

答:在页面初始化时调用OneLoginHelper.with().setRequestedOrientation(MainActivity.this,false)即可。然后页面的偏移量可以在OneLoginThemeConfig中进行配置。

9. 怎样设置主题?

答:在清单文件中的activity中进行相关配置。

10. 怎样隐藏返回图标?

答:在0.6.1版本之后,可以通过setAuthNavReturnImgView方法设置。

11. 怎样实现第三方登录的自定义?

答:在Demo中有详细的方法展示,在这里展示部分代码。

private void initLogin() {
LayoutInflater inflater1 = LayoutInflater.from(context);
RelativeLayout relativeLayout = (RelativeLayout) inflater1.inflate(R.layout.relative_item_view, null);
RelativeLayout.LayoutParams layoutParamsOther = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParamsOther.setMargins(0,dip2px(context, 430), 0, 0);
layoutParamsOther.addRule(RelativeLayout.CENTER_HORIZONTAL);
relativeLayout.setLayoutParams(layoutParamsOther);
ImageView weixin = relativeLayout.findViewById(R.id.weixin);
ImageView qq = relativeLayout.findViewById(R.id.qq);
ImageView weibo = relativeLayout.findViewById(R.id.weibo);
weixin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "微信登录", Toast.LENGTH_SHORT).show();
}
});
qq.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "qq登录", Toast.LENGTH_SHORT).show();

}
});
weibo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "微博登录", Toast.LENGTH_SHORT).show();

}
});
OneLoginHelper.with().addOneLoginRegisterViewConfig("title_button", new AuthRegisterViewConfig.Builder()
.setView(relativeLayout)
.setRootViewId(AuthRegisterViewConfig.RootViewId.ROOT_VIEW_ID_BODY)
.setCustomInterface(new CustomInterface() {
@Override
public void onClick(Context context) {
Toast.makeText(context, "动态注册的其他按钮", Toast.LENGTH_SHORT).show();
}
})
.build()
);
}

12. 怎样设置弹窗形式?

答:在0.6.1版本之后,可以通过setDialogTheme方法设置。注意:0.8.0之后,只需配置两个activity的theme主题即可。

然后为activity设置弹窗theme主题。

<style name="Theme.ActivityDialogStyle" parent="Theme.AppCompat.Light.NoActionBar"> <!--背景透明-->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item> <!--dialog的整个屏幕的背景是否有遮障层-->
<item name="android:backgroundDimEnabled">true</item>
</style>

然后在清单文件中配置,比如:

<!-- oneLogin -->
<activity
android:name="com.geetest.onelogin.activity.OneLoginActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:theme="@style/Theme.ActivityDialogStyle"
android:screenOrientation="behind" />
<activity
android:name="com.geetest.onelogin.activity.OneLoginWebActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"
android:screenOrientation="behind" />

然后按照设计图来进行偏移量的调整。

附录

客户端集成插件(除了原生的Android SDK 之外,OneLogin提供主流的开发工具集成插件)

React Native:https://github.com/GeeTeam/gt-onelogin-rn-example

Flutter:https://github.com/GeeTeam/gt-onelogin-flutter-example