2012-06-13 25 views
0

[解决了,但我愿意接受新建议...]Twitter的API返回无效的回调 - 不能授权

我使用twitter4j整合Twitter的到我的Android应用程序。

当我试着使用Twitter的授权,我打电话以下端点与我的OAuth令牌:

https://api.twitter.com/oauth/authenticate?oauth_token=MY_VALID_TOKEN

应该重定向我:

MY-CALLBACK:///?oauth_token=***&oauth_verifier=***

但相反,它将我重定向到:

https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***

这显然不是一个有效的网址。
(此外,:缺失 - 它应该是MY-CALLBACK:///...

请注意我用的WebView我的电话


我可以操纵这个字符串,使一切工作,但必须有一个更好的办法...



我通过我的回调URL到

getOAuthRequestToken("MY-CALLBACK:///");

,并已与

<data android:scheme="x-oauthflow-twitter" />

还设置意图过滤器对我的活动,该活动具有android:launchMode="singleInstance"



我在做什么错?


[编辑:更多信息]

mTwitter = new TwitterFactory().getInstance(); 
mTwitter.setOAuthConsumer(Constants.TWITTER_CONSUMER_KEY, Constants.TWITTER_CONSUMER_SECRET); 

twitterWebView = new WebView(ActivityTwitterAuthorize.this); 

twitterWebView.setWebViewClient(new WebViewClient() { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith(Constants.TWITTER_CALLBACK_URL)) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 

     // HACKY PART! 
     // I added the following code to force it to work, but this is a dirty hack... 
     // String TWITTER_CALLBACK_INVALID_PREFIX = "https://api.twitter.comx-oauthflow-twitter///"; 
     // TWITTER_CALLBACK_URL = "MY-CALLBACK:///"; 
     // BEGIN 
     } else if (url.startsWith(TWITTER_CALLBACK_INVALID_PREFIX)) { 
      url = url.substring(TWITTER_CALLBACK_INVALID_PREFIX.length()); 
      url = Constants.TWITTER_CALLBACK_URL + url; 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 
     // END 

     } else { 
      view.loadUrl(url); 
     } 
     return true; 
    } 

}); 

mTwitterReqToken = mTwitter.getOAuthRequestToken(Constants.TWITTER_CALLBACK_URL); 

twitterWebView.loadUrl(mTwitterReqToken.getAuthenticationURL()); 

没有哈克的一部分,该代码会导致 “网页不可用” 错误,因为该网址是无效的:

https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***

如果网址为MY-CALLBACK:///?oauth_token=***&oauth_verifier=***那么我的活动会收到一个意图,一切都会好的...

对于“hacky部分”,我的代码有效,但我想避免这段代码。

+0

请给更多的细节,我不明白你的问题。 –

+0

您需要在获取if(url.startsWith(Constants.TWITTER_CALLBACK_URL))条件后关闭webView对话框。 –

+0

我也试过,但即使当我在浏览器中输入'https://api.twitter.com/oauth/authenticate?oauth_token = MY_VALID_TOKEN'时,Twitter api会返回无效的url ... –

回答

3

我发现我无法按照我在网上看到的指南按照这种方式工作。

最后我用我自己的自定义WebViewClient与代码:

if (url.contains("MY-CALLBACK:///")) 
{ 
    final int start = url.indexOf('?') + 1; 
    final String params = url.substring(start); 
    final String verifierToken = "oauth_verifier="; 
    if (params.contains(verifierToken)) 
    { 
     final int value = params.indexOf(verifierToken) + verifierToken.length(); 
     final String token = params.substring(value); 
     view.stopLoading();     
     authoriseNewUser(token); 
    } 
    else if (params.contains("denied")) 
    { 
     view.stopLoading(); 
     finish(); 
    } 
} 
else 
{ 
    view.loadUrl(url); 
} 
return true; 
+0

这就是我所做的(检查我的回调url是否存在于返回的url中,并将其修改为符合我预期的格式),但有没有更好的方法? –

+0

实际上,我认为我会重写我的代码来使用类似这样的内容而不是广播内容......这样效率更高!如果没有人提供更好的解决方案,我会接受这个答案。 –

+1

这绝对是最好的解决方案,我完全删除了意图过滤器!只是一个建议,为了从字符串中提取查询参数,你可以使用'Uri uri = Uri.parse(url);字符串oAuthVerifier = uri.getQueryParameter(“oauth_verifier”);如果(oAuthVerifier!= null){...}'它看起来更好,然后url.substring()的东西......谢谢! –

0

使用下面CallBack_URI对于这一点,它可以帮助你。

public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; 
public static final String OAUTH_CALLBACK_HOST = "callback"; 
public static final String CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; 
+0

不,这不重要。完全可以只使用OAUTH_CALLBACK_SCHEME +“:///” –

0
public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; 
public static final String OAUTH_CALLBACK_HOST = "litestcalback"; 
public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME+ "://" +OAUTH_CALLBACK_HOST; 

使用这种类型的代码和清单文件callback_url的...

+0

这是第三个回答,说我的回调网址是错误的。不,我的回调网址没有错。我已经试过这个,不管我使用SCHEME:// HOST还是只是SCHEME:/// –

+0

亲爱的你使用SCHEME:// HOST ....并且试试这个.... –

+0

我试过'public static final String TWITTER_CALLBACK_URL =“x-oauthflow-twitter:///”;'我也试过'public static final String TWITTER_CALLBACK_URL =“x-oauthflow-twitter:// callback”;'。无所谓,它无论如何不起作用... –

0

我想有什么不对您的代码。昨天我得到了同样的结果,但今天它的作用像一个魅力。这可能是一个服务器端问题。你能否再次尝试你的原创(没有hacky部分)解决方案,请问?

+0

我猜想这是服务器端问题。我包括处理这两种情况的代码,只是为了安全起见。我编写记录何时执行“hacky”部分,所以我会检查它。这几天我会让你知道的... –