Skip to content

Instantly share code, notes, and snippets.

@SpiritOfDarkDragon
Last active August 29, 2015 14:07
Show Gist options
  • Save SpiritOfDarkDragon/17949ae318e7f0a78b12 to your computer and use it in GitHub Desktop.
Save SpiritOfDarkDragon/17949ae318e7f0a78b12 to your computer and use it in GitHub Desktop.
0. Авторизация происходит по трёхступенчатой схеме:
docs: https://dev.twitter.com/web/sign-in/implementing
1. Нам понадобятся 3 библиотеки.
compile('org.twitter4j:twitter4j-core:3.0.5')
compile('oauth.signpost:signpost-core:1.2.1.1')
compile('oauth.signpost:signpost-commonshttp4:1.2.1.1')
2. Заводим переменные
private Twitter twitter;
private RequestToken requestToken;
private AccessToken accessToken;
3. Инициализируем twitter при старте
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.setOAuthConsumerKey("1234567890abc"); //consumer key from https://apps.twitter.com
builder.setOAuthConsumerSecret("gfs098765423"); //consumer key secret from https://apps.twitter.com
Configuration configuration = builder.build();
TwitterFactory factory = new TwitterFactory(configuration);
twitter = factory.getInstance();
4. При необходимости авторизации через tw запрашиваем request_token и request_token_secret, а заодно получаем url по которому будет форма авторизации для пользователя //долго, нужен отдельный поток и лоадер, а то ощущение что висим
requestToken = twitter.getOAuthRequestToken("oauth://t4jsample"); //callback url from https://apps.twitter.com илилюбая другая шняга
//Log.d(TAG, "requestToken="+requestToken.getToken());
//Log.d(TAG, "requestTokenSecret="+requestToken.getTokenSecret());
5. Бросаем url (Uri.parse(requestToken.getAuthenticationURL()).toString()) в activity с webview или вообще интентом в дефолтный браузер
Да, форму авторизации c webview нам нужно описывать самим. Я сделал для этого отдельную activity:
5.1 ActivityMain
Intent auth = new Intent(ActivityMain.this, TwitterLogin.class);
Bundle bundle = new Bundle();
bundle.putString("auth_url", url);
auth.putExtras(bundle);
startActivityForResult(auth, REQ_TWITTER);//REQ_TWITTER=1, just operation code
5.2 TwitterLogin
webView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (url != null && url.startsWith() {//в ответ получаем url с 2 параметрами, их надо парсить
String[] urlParameters = url.split("\\?")[1].split("&");
String oauthToken = "";
String oauthVerifier = "";
if (urlParameters[0].startsWith("oauth_token")) oauthToken = urlParameters[0].split("=")[1];
else if (urlParameters[1].startsWith("oauth_token")) oauthToken = urlParameters[1].split("=")[1];
if (urlParameters[0].startsWith("oauth_verifier")) oauthVerifier = urlParameters[0].split("=")[1];
else if (urlParameters[1].startsWith("oauth_verifier")) oauthVerifier = urlParameters[1].split("=")[1];
Intent intent = getIntent();
intent.putExtra("oauth_token", oauthToken);
intent.putExtra("oauth_verifier", oauthVerifier);
setResult(Activity.RESULT_OK, intent);
finish();
}
}
});
webView.loadUrl(this.getIntent().getExtras().getString("auth_url"));
6. Заправшиваем access_token, тоже в отдельном треде и получаем наконец-то окончательные oauth_token и oauth_token_secret для пользователя
accessToken = twitter.getOAuthAccessToken(requestToken, oauthVerifier);
//Log.d(TAG,"accessToken="+accessToken.getToken());
//Log.d(TAG,"accessTokenSecret="+accessToken.getTokenSecret());
P.S. Важно! Если часовой пояс стоит неверный, то на запрос getOAuthRequestToken() будет возвращаться TwitterException c кодом 401. Запросы подписываются с функцией от времени.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment