一、oauth2.0说明
由于项目需要,需要开发一个供第三方应用的sdk,主要功能就是第三方应用使用我们的A平台的用户登录,就像使用新浪微博登录第三方应用功能一样。
Oauth2.0其实是一个认证标准,主要流程是用户使用A平台的帐号登录授权B应用,这里主要有两个过程:
第一个过程是用户登录A平台之后,A平台返回一个token给B应用,这里包含有效期、刷新token等。
第二个过程是B应用根据第一步得到的token来换取有用的信息。
二、具体实现
首先考虑到sdk最终是集成在第三方应用中的,但是又要调用A平台的登录界面来登录授权,这里有两种方式实现:
1、直接弹出网页调用A平台的登录功能并返回。
参照一些大的开放平台的实现方式是,在sdk中直接弹出一个自定义的dialog,生成一个WebView添加到dialog,然后webview load A平台后台访问地址。
这里涉及到webview 中的js和android java类中的方法的相互访问问题,
webview.getSettings().setJavaScriptEnabled(true);
webview.addJavascriptInterfalse(java类实例,"向外抛给js访问的对象名 name");
假如类中有方法cancel();js中调用的结构为:window.name.cancel();即回调到java类中的cancel()。
2、是启用A平台的app,调用登录并返回结果。
这种实现是用户首先有安装A平台APP的情况下才能工作,在A的app中实现一个供第三方平台登录的activity,布局文件直接用webview,load后台界面即可。
这里涉及到android的跨app请求activity的问题。
Intent intent = new Intent();
ComponentName cn = new ComponentName(packagename, activityname);
intent.setComponent(cn);
这里注意一下,通过app的context可以判断activity是否可用:
context.getPackageManager().getpackageInfo(cn, 0);若需要访问的activity不可用会抛出NameNotFoundException。
这里被访问的activity若没有配置intent-filter的话要在manifest.xml中配置android:exported=true,否则报错。
app实现登录授权的时候涉及到了登录完成返回的一个问题,纠结了半天,参照了一下别人的是,在sdk中集成一个只处理数据的activity,oncreate方法中接收参数,然后调用监听,关闭此activity即可!
另外记录一下:
context.getPackageManager().getPackageInfo(packagename, 0);用包名可以判断一个应用是否已安装。
activity之间传递序列化的对象用Bundle。
自定义dialog,继承Dialog。