oAuth机制对于网站间的受权管理是很容易实现的,设置好app回调端口,当数据服务提供方拿到其用户受权,则返回受权码发送到回调端口。上一篇文章介绍了如何受权Forge app访问Autodesk 云应用数据,即,获取三条腿的token。android
但移动端的原生app,受权码返回到发起请求app的某个Activity,可如何得知是哪一个Activity而且跳转到此Activity?这时就要用到URL Scheme。iOS和Android都提供了这样的机制。它实现了页面内跳转协议,经过定义本身的scheme协议,很是方便跳转到app中的各个Activity。也让不一样app能够唤起其它app的Activity。固然,前提app已经安装到系统。这位大咖对此话题作了专业的讲解,推荐你们先阅读:
https://www.jianshu.com/p/7b0...git
个人同事Bryan搭建了一个框架,演示Android app 集成Forge oAuth,拿到三条腿token,并调用了用户信息(Profile)API,列出登陆用户的在Forge数据管理中的基本信息。该框架很好的展现了使用URL Scheme整个过程。
https://github.com/dukedhx/oa...github
我借此学习了有关内容。另外,基于此代码,略微改造,添加流程展现获取Autodesk云应用的Hub,Project,Folder和File,为进一步的综合应用app作一些铺垫。
https://github.com/xiaodongli...segmentfault
oAuth相关的几个步骤:安全
1.定义监听oAuth回传的Activity属性服务器
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <data android:scheme="@string/FORGE_CALLBACK_SCHEME" android:host="@string/FORGE_CALLBACK_HOST"/> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter> </activity>
其中,FORGE_CALLBACK_SCHEME和FORGE_CALLBACK_HOST定义为:app
<string name="FORGE_CALLBACK_SCHEME">lxdapp</string> <string name="FORGE_CALLBACK_HOST">mytest3legged</string>
一样的, URL Scheme必须和Forge app注册的时候填写的callback URL要一致。 框架
2.登陆事件将建立一个Intent.ACTION_VIEW,用以启动网页,URL拼接了Forge app的client id,受权方式 (response_type=code),回传地址和受权的权限范围 跳转到Autodesk登陆过程,等待客户受权。ide
public void onLoginClick(View v) { Intent i = new Intent(Intent.ACTION_VIEW); Resources resources = getResources(); i.setData(Uri.parse(getResources().getString(R.string.FORGE_AUTHORIZATION_URL) + "?response_type=code&redirect_uri=" + this.getCallbackUrl() + "&scope=" + resources.getString(R.string.FORGE_SCOPE) + "&client_id=" + resources.getString(R.string.FORGE_CLIENT_ID))); startActivity(i); }
3.用户受权后,将对URLScheme地址回传,也就是发起请求的Activity。Activity的OnStart拿到回传信息。因为没有设定android:mimetype, 则任何数据类型均可接收。但咱们须要只是受权码,在回传请求的URL参数中。学习
@Override protected void onStart() { super.onStart(); Intent intent = getIntent(); Uri data = intent == null ? null : intent.getData(); //从回传请求中拿到受权码 String authorizationCode = data == null ? null : data.getQueryParameter("code"); if (authorizationCode != null && !authorizationCode.isEmpty()) { ......
4.接下来的过程就和常规的网页应用相似了,依受权码获得最终的token。
5.该样例调用Forge服务采起okhttp3,推荐参考下文的详细讲解:
https://www.jianshu.com/p/da4...
注: