Twitter OAuth 2.0 by login-password

Сегодня расскажу как реализовывается работа приложения через OAuth, если пользователь передает просто логин и пароль. Прежде всего потребуется класс OAuthUtility, код которого есть в blogsapi.

На первом этапе мы проверяем производили ли мы аутентификацию пользователя ранее. Если нет, то обращаемся к твиттеру с логином и паролем, соответствующему нашему приложению (tokens.ConsumerKey,tokens.ConsumerSecret). Получаем назад ключ(response.Token), по которому мы можем построить запрос (OAuthUtility.BuildAuthorizationUri(response.Token)) на получение уникальных логина и пароля для пользователя нашего приложения. Назад возвращается страница, на которой пользователю предлагается ввести логин и пароль, но так как мы не хотим тревожить пользователя, то вводим их за него, незабывая извлечь со страницы authenticity_token. Если логин и пароль правильны, то нам возвращается уникальный PIN, который пользователь должен потом передать нашему приложению, в качестве единоразового пароля для получения постоянного пароля. Опять же парсим страницу вручную, чтобы не тревожить пользователя. И в завершение делаем запрос OAuthUtility.GetAccessToken, чтобы по разовому паролю наше приложение получило постоянный пароль. И сохраняем результат, чтобы больше не повторять этих действий.

В итоге наше приложение, чтобы сделать запрос от лица пользователя передает не логин и пароль, а аж 4 строчки, соответствующие 2м логинам и паролям от них. Основная выгода - безопастность, и то, что эти строчки намного сложнее чем первоначальные логин и пароль пользователя, что гарантирует сложность их подбора. Но с другой стороны, они не имеют срока давности, поэтому зная их с легкостью можно выполнить действия от лица пользователя-приложения, в отличии от куков или сессий для авторизованных клиентов сайтов.

И общая схема, демонстрирующая весь ужас того, во что превращается простая ранее операция по выполнению действий при помощи логина и пароля:


Код самой функции "залогинивания" в твиттер.
Copy Source | Copy HTML
  1. /// <summary>
  2.         /// Простая попытка залогинится
  3.         /// </summary>
  4.         /// <param name="user"></param>
  5.         /// <returns></returns>
  6.         public override bool LogInto(UserAccaunt user)
  7.         {
  8.             try
  9.             {
  10.                 OAuthTokens tokens = Configuration.GetTokens(user.username);
  11.                 if(String.IsNullOrEmpty(tokens.AccessToken))
  12.                 {
  13.                     //нет ключа, производим аутентификацию.
  14.                     //залогинимся в твиттер, получим куку и передадим ее дальше
  15.                     //0
  16.                     OAuthTokenResponse response = OAuthUtility.GetRequestToken(tokens.ConsumerKey,
  17.                         tokens.ConsumerSecret, String.Empty);
  18.                     //1
  19.                     HttpWebRequest myHttpWebRequest = (HttpWebRequest)
  20.                         WebRequest.Create(OAuthUtility.BuildAuthorizationUri(response.Token));
  21.                     myHttpWebRequest.Method = "GET";
  22.                     myHttpWebRequest.AllowAutoRedirect = false;
  23.                    // myHttpWebRequest.Headers.Add(HttpRequestHeader.Cookie, sCookie);
  24.                     HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
  25.                     string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding).ReadToEnd();
  26.                     sCookie = CookieParse(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]);
  27.                     myHttpWebResponse.Close();
  28.                     ///////////////////////
  29.                     Match m = new Regex(@"<input.*?name\W+authenticity_token.+?value\W+(\w+)\W", Regexoptions).Match(result);
  30.                     if (!m.Success) throw new Exception("Twitter authenticity_token problems!");
  31.                     myHttpWebRequest = MakeRequest("https://twitter.com/oauth/authorize");
  32.                     myHttpWebRequest.AllowAutoRedirect = false;
  33.                     myHttpWebRequest.Method = "POST";
  34.                     myHttpWebRequest.Referer = "http://twitter.com";
  35.                     string sQueryString =
  36.                         String.Format(
  37.                             "authenticity_token={0}&return_to_ssl=false&session%5Busername_or_email%5D={1}&session%5Bpassword%5D={2}&oauth_token={3}",
  38.                     m.Groups[1].Value,
  39.                     user.username,
  40.                     user.password,
  41.                     response.Token
  42.                             );
  43.                     //***************//
  44.                     byte[] byteArr = _encoding.GetBytes(sQueryString);
  45.                     myHttpWebRequest.ContentLength = byteArr.Length;
  46.                     myHttpWebRequest.GetRequestStream().Write(byteArr,  0, byteArr.Length);
  47.                     /////////////////////////
  48.                     myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
  49.                     sCookie = CookieParse(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]);
  50.                     result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding).ReadToEnd();
  51.                     myHttpWebResponse.Close();
  52.                     //в теории отсюда нужно извлечь PIN для вставки
  53.                     m = new Regex(@"\Woauth_pin\W\D+(\d+)\D", Regexoptions).Match(result);
  54.                     if(!m.Success) throw new Exception("не удалось получить PIN!");
  55.  
  56.                     response = OAuthUtility.GetAccessToken(tokens.ConsumerKey,
  57.                                                 tokens.ConsumerSecret, response.Token, m.Groups[1].Value);
  58.                     if (response != null)
  59.                     {
  60.                         //сохраняем токен, чтобы следующий раз не проходить всю цепочку.
  61.                         Configuration.SetTokens(user.username, response);
  62.                     }
  63.                 }
  64.                 LogedInAs = user;
  65.                 //Log("Twitter uses only OAuth2.0 authentification. Take care.");
  66.                 return true;
  67.             }catch(Exception e1)
  68.             {
  69.                 Log("Twitter OAuth "+e1.Message);
  70.                 return false;
  71.             }
  72.         }

Метки:   Категории:Twitter | BlogsAPI | Code


blog comments powered by Disqus

Добавить комментарий

Кто я?

Программист. Я слежу за блогосферой и знаю, как будет развиваться интернет. Когда у меня есть время я даже прилагаю для этого усилия. Подробнее

Последние комментарии

Не отображать

Topbot at FeedsBurner

Мои Твиты

Twitter января 17, 13:37
программа instagramliker обновлена 2018г http://dlvr.it/QBbVpV

Twitter января 16, 16:22
Разбор Звездные войны: Последние джедаи http://dlvr.it/QBSdwN https://twitter.com/f1ashr/status/953301465962921985/photo/1

Twitter января 14, 19:00
8 японок основали поп-группу для пропаганды криптовалют http://dlvr.it/QBC3cw https://twitter.com/f1ashr/status/952616326605938688/photo/1

Twitter января 7, 10:12
Белый шум защищен авторским правом на youtube http://dlvr.it/Q9DFXS

Twitter января 1, 20:52
Новогодние белки http://dlvr.it/Q8SyPZ https://twitter.com/f1ashr/status/947933468222152704/photo/1

Twitter января 1, 16:43
Популярные блогеры и посты за 2017 год http://dlvr.it/Q8RpTj https://twitter.com/f1ashr/status/947870931896082433/photo/1

Twitter января 1, 15:37
@true_policy @nickolas_vs @KremlinRussia @iremeslo Но Путин делает все, чтобы выборная система в глазах аборигенов стала нелегитимной.

Twitter января 1, 11:32
@true_policy @nickolas_vs @KremlinRussia @iremeslo Нужен не новый президент, а другой система. От демократии к респ… https://twitter.com/i/web/status/947792574697431040

Twitter декабря 31, 21:11
Самоуправляемые ездящие картошки http://dlvr.it/Q8MGMd

Twitter декабря 31, 13:34
Разбор сериала Медичи: Повелители Флоренции http://dlvr.it/Q8KDRt https://twitter.com/f1ashr/status/947460855972601857/photo/1

Twitter декабря 31, 11:32
Папа Римский выступил на TED http://dlvr.it/Q8Jjb5

Twitter декабря 31, 10:25
коломенский кремль: альтернативная история 2 http://dlvr.it/Q8JRYv https://twitter.com/f1ashr/status/947413453701971968/photo/1

Twitter декабря 31, 10:25
Суперлайки в Перископе http://dlvr.it/Q8JRYr

Twitter декабря 30, 15:16
Peace, Death! (Пиз Дец) http://dlvr.it/Q8Cv1S https://twitter.com/f1ashr/status/947124264259395584/photo/1

Twitter декабря 30, 15:16
Итоги 2016 года в Живом Журнале http://dlvr.it/Q8Ctw6 https://twitter.com/f1ashr/status/947124257149956096/photo/1

Twitter декабря 30, 13:39
Разбор сериала "Молодой папа" (теория общего знания, часть 22) http://dlvr.it/Q8CP7P https://twitter.com/f1ashr/status/947099721675370496/photo/1

Twitter декабря 30, 13:05
Механического медведя не починить - пятая песня FNAF http://dlvr.it/Q8CDG8 https://twitter.com/f1ashr/status/947091170844278784/photo/1

Twitter декабря 30, 10:55
Skype and Baidu links http://dlvr.it/Q8Bf03

Twitter декабря 30, 10:23
Яндекс атаковал Израиль http://dlvr.it/Q8BWKR

Twitter декабря 30, 10:23
По случаю 8 марта погасили статую свободы http://dlvr.it/Q8BW9V https://twitter.com/f1ashr/status/947050399160156161/photo/1

Мой твиттер

Копирайт

Все мысли, высказанные в блоге, являются моим мнением и за это мнение меня никто не забанит! Кроме того, никто не имеет право копировать материалы блога без использования ctrl+C/V!

© Copyright 2008