IT技术博客大学习 共学习 共进步

新浪微博 Android SDK中OAuth2.0隐式授权部分的一个代码逻辑问题

Michael`s blog 2012-07-09 23:03:44 浏览 3,444 次

在最近使用新浪微博android sdk开发微博登录的时候,从日志中发现一个问题,就是自定义的WeiboDialogListener里面的方法,比如onComplete或者onCancel等,经常会被两次调用,这样其实会导致一些隐性问题,比如增加额外的客户端和服务端的开销,因为我们通常会在onComplete()里面完成更多后续逻辑的处理,而发生这样的情况时,会被处理两次,一开始我犯懒,就在方法外面加入了一个变量 isCompleted 来进行判断,算是暂时解决了问题,后来在好几个地方要开发类似功能的时候,总感觉心里有点儿不爽,于是决定找找到底啥原因

看了看微博sdk里面的代码,在 WeiboDialog.java里面找到了问题,这个java文件主要实现的是创建OAuth的UI,并且通过实现和调用WebViewClient的方法来访问微博的api以及咱们app的callback url, 进而通过WebViewClient里面捕获当前请求的URL,分析URL参数后进行相应逻辑的判断,通过分析,问题应该是在这部分。

在WeiboDialog.java里面有个函数 handleRedirectUrl(),这个函数就是用来判断认证和授权过程中返回参数的,代码如下:

privatevoidhandleRedirectUrl(WebViewview, Stringurl){
        
Bundlevalues = Utility.parseUrl(url);
 
        
Stringerror = values.getString("error");
        
Stringerror_code = values.getString("error_code");
        
        
if(error == null && error_code == null){
            
mListener.onComplete(values);
        
}elseif(error.equals("access_denied")){
            
// 用户或授权服务器拒绝授予数据访问权限
            
mListener.onCancel();
        
}else{
            
mListener.onWeiboException(newWeiboException(error, Integer.parseInt(error_code)));
        
}
    
}

一看就知道啥意思了,关键的逻辑就在这里面,回调我们自己实现的WeiboDialogListener里面的方法,顺藤摸瓜,调用该方法的代码就在实现WebViewClient里面,研究了一下该部分代码,找到了原因

在WebViewClient中,我们需要实现至少shouldOverrideUrlLoading()方法,该方法在每次加载新url的时候调用,另外,我们还通常会实现onPageStarted()方法,该方法也是在新url开始加载的时候进行调用(注意:在frame里面加载是不会调用的,详细文档见http://developer.android.com/reference/android/webkit/WebViewClient.html)

在WeiboDialog.java实现WebViewClient对象的时候,在shouldOverrideUrlLoading()和onPageStarted()里面都同时调用了handleRedirectUrl()来进行回调url和参数的判断,结果就导致了我遇到的问题,于是我们可以把里面的一个去掉,或者增加一个参数来进行判断,避免重复调用,目前一切正常了!

建议继续学习

  1. 基于PECL OAuth打造微博应用 (阅读 5,103)
  2. 深入理解OAuth与豆瓣OAuth test (阅读 4,946)
  3. 新浪微博OAuth认证流程分析 (阅读 4,923)
  4. PHP for Twitter OAuth 教学演示 (阅读 4,645)
  5. 在sae中利用SaeFetchurl进行豆瓣的OAuth授权 (阅读 4,524)
  6. OAuth那些事儿 (阅读 4,165)
  7. OAuth 1.0a与1.0协议的改进… (阅读 3,805)
  8. 【社会化设计】自我(self)部分――授权 (阅读 3,644)
  9. 【社会化设计】自我(self)部分――密码反面模式(the Password Anti-pattern) (阅读 3,626)
  10. 简述 OAuth 2.0 的运作流程 (阅读 3,324)