【问题标题】:Twitter API returns invalid callback - Cannot authorizeTwitter API 返回无效回调 - 无法授权
【发布时间】:2012-08-29 00:46:14
【问题描述】:

[已解决,但我愿意接受新的建议...]

我正在使用 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());

没有 hacky 部分,此代码会导致“网页不可用”错误,因为 url 无效:

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

如果 url 是 MY-CALLBACK:///?oauth_token=***&oauth_verifier=***,那么我的活动将收到一个 Intent,一切都会好起来的......

有了“hacky 部分”,我的代码可以工作,但我想避免使用那段代码。

【问题讨论】:

  • 请提供更多细节,我不明白您的问题。
  • 获取 if (url.startsWith(Constants.TWITTER_CALLBACK_URL)) 条件后需要关闭 webView 对话框。
  • 我也试过了,但即使我在浏览器中输入https://api.twitter.com/oauth/authenticate?oauth_token=MY_VALID_TOKEN,Twitter api 也会返回无效的 url...

标签: android twitter twitter-oauth twitter4j


【解决方案1】:

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

我最终使用了我自己的自定义 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;

【讨论】:

  • 这基本上也是我所做的(检查返回的 url 中是否存在我的回调 url,并修改它以匹配我的预期格式),但是有更好的方法吗?
  • 实际上,我想我会修改我的代码以使用类似的东西而不是广播 Intents... 这效率更高!如果没有人提供更好的解决方案,我会接受这个答案。
  • 这绝对是最好的解决方案,我完全删除了intent-filter!只是给你一个建议,为了从你的字符串中提取查询参数,你可以使用Uri uri = Uri.parse(url); String oAuthVerifier = uri.getQueryParameter("oauth_verifier"); if (oAuthVerifier != null) {...} 它看起来比 url.substring() 更好......谢谢!
  • @ScouseChris 你能说你把这段代码放在哪里了吗?
  • @Afflatus 我添加了签入 shouldOverrideUrlLoading
【解决方案2】:

使用Below 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;

【讨论】:

  • 不,这不是重点。完全可以只使用 OAUTH_CALLBACK_SCHEME + ":///"
【解决方案3】:

我想您的代码没有问题。我昨天得到了同样的结果,但今天它就像一个魅力。这可能是服务器端的问题。请您再试一次您原来的(没有骇人听闻的部分)解决方案吗?

【讨论】:

  • 我猜这是服务器端的问题。为了安全起见,我包含了处理这两种情况的代码。我在执行“hacky”部分时写日志,所以我会检查一下。这些天我会告诉你的......
【解决方案4】:
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...

【讨论】:

  • 这是第三个说我的回调 url 错误的答案。不,我的回调 url 没有错。我已经尝试过了,无论我使用 SCHEME://HOST 还是只使用 SCHEME:/// 都是一样的
  • 我试过public static final String TWITTER_CALLBACK_URL = "x-oauthflow-twitter:///";,也试过public static final String TWITTER_CALLBACK_URL = "x-oauthflow-twitter://callback";。没关系,反正也没用……
  • 试试这个亲爱的。私有静态最终 Uri CALLBACK_URI = Uri.parse("twifj://twitterfj");并在您的自定义 WebViewClient if (url.startsWith(CALLBACK_URI.toString())) {}
  • 我非常感谢您的努力,但这对我没有帮助。从服务器返回的 url 根本不以我的回调 uri 开头。它以 https://api.twitter.com 开头,然后是我的回调 uri
猜你喜欢
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 2020-03-29
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多