Instagram-oauth-2

Сегодня не работает Инстаграм, поэтому небольшой фрагмент кода рассказывающий про реализацию oauth2.0 для instagram. Проект этот достаточно молодой, поэтому наплевал не только на интерфейс, но и на правильность реализации некоторых функций, в частности в документации есть ошибки, где указан параметр client_id вместо consumer_key, надо быть внимательным. Но основную проблему может создать некорректность ответа на запрос о получении токена, со стороны инстаграма. И так как мы используем библиотеку DotNetOpenAuth для реализации залогинивания, то и переопределение или замена каких-либо методов достаточно сложна. Во-первых, так как библиотека написана профессионалами, то в ней много inner и private классов и protected функций. Единственный правильный выход это переопределить метод ProcessUserAuthorization, таким образом, что наш InstagramClient : WebServerClient будет выглядет следующим образом:

Copy Source | Copy HTML
  1. public class InstagramClient : WebServerClient
  2. {
  3.     public UserInfo User;
  4.     private static readonly AuthorizationServerDescription Description = new AuthorizationServerDescription
  5.         {
  6.             AuthorizationEndpoint = new Uri("https://api.instagram.com/oauth/authorize/"),
  7.             ProtocolVersion = OAuth2.ProtocolVersion.V20,
  8.             TokenEndpoint = new Uri("https://api.instagram.com/oauth/access_token"),
  9.         };
  10.     /// <summary>
  11.     /// Initializes a new instance of the <see cref="InstagramClient"/> class.
  12.     /// </summary>
  13.     public InstagramClient()
  14.         : base(Description)
  15.     {
  16.         this.AuthorizationTracker = new TokenManager();
  17.     }
  18.     /// <summary>
  19.     /// Получение токена авторизации
  20.     /// </summary>
  21.     /// <param name="request"></param>
  22.     /// <returns></returns>
  23.     /// <remarks>http://instagr.am/developer/authentication/</remarks>
  24.     public new IAuthorizationState ProcessUserAuthorization(HttpRequestBase request = null)
  25.     {
  26.         if(HttpContext.Current == null || String.IsNullOrEmpty(HttpContext.Current.Request["code"]))
  27.         {
  28.             //redirect
  29.             return base.ProcessUserAuthorization(request);
  30.         }
  31.         Uri callback = MessagingUtilities.GetRequestUrlFromContext();
  32.         callback = new Uri(callback.Scheme+"://"+callback.Authority+callback.AbsolutePath);
  33.         //manual processing
  34. //'client_id=CLIENT-ID' \
  35. //-F 'client_secret=CLIENT-SECRET' \
  36. //-F 'grant_type=authorization_code' \
  37. //-F 'redirect_uri=YOUR-REDIRECT-URI' \
  38. //-F 'code=CODE' \https://api.instagram.com/oauth/access_token
  39.             var args = new Dictionary<string, string>
  40.                            {
  41.                                {"client_id", Instagram.APIKey.ClientId},
  42.                                {"client_secret", ConfigurationManager.AppSettings["instagramConsumerSecret"]},
  43.                                {"grant_type", "authorization_code"},
  44.                                {"redirect_uri", callback.OriginalString},
  45.                                {"code", HttpContext.Current.Request["code"]}
  46.                            };
  47.         string JSON = HttpClient.POST(Description.TokenEndpoint.OriginalString, args);
  48.             JObject obj = JObject.Parse(JSON);
  49.             if (obj["error_message"] != null)
  50.             {
  51.                 Debug.WriteLine(JSON);
  52.                 HttpContext.Current.Response.Redirect(String.Format("/?{0}", obj["error_message"].Value<string>()), true);
  53.             }
  54.             if(obj["user"]!=null)
  55.             {
  56.                 //(Model.Responses.UserResponse)Mapper.Map<Model.Responses.UserResponse>(GetJson(AuthInfo.User.Id))
  57.                 User = (UserInfo)Mapper.Map<UserInfo>(obj["user"].ToString());
  58.             }
  59.             return new AuthorizationState { AccessTokenIssueDateUtc = DateTime.Now, AccessToken = obj["access_token"].Value<string>() };
  60.     }
  61. }

Метки: ,   Категории:Code


blog comments powered by Disqus

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

Кто я?

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

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

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

Topbot at FeedsBurner

Облако тэгов

Мои Твиты

Twitter мая 25, 17:18
Рейтинг каналов и ботов Телеграм http://dlvr.it/QV5d6Y

Twitter мая 25, 16:12
Пример божественного вмешательства в фильме No country for old men http://dlvr.it/QV5HxB https://twitter.com/f1ashr/status/1000046919136067586/photo/1

Twitter мая 25, 15:06
Танцы человека с роботом http://dlvr.it/QV4y0p

Twitter мая 25, 13:30
роботы пишут жалобы http://dlvr.it/QV4QQG

Twitter мая 25, 09:43
Шахматная композиция для демонстрации 3-го этапа общества http://dlvr.it/QV3G9p https://twitter.com/f1ashr/status/999948953805180928/photo/1

Twitter мая 25, 09:11
Hoverbike for US Army http://dlvr.it/QV3674

Twitter мая 25, 08:07
Google AdWords купон на 1600p http://dlvr.it/QV2pMz

Twitter мая 25, 08:07
Соц.медиа http://dlvr.it/QV2pNR

Twitter мая 25, 08:07
Мониторинг соц.сетей на госзакупках - 5 http://dlvr.it/QV2pP3

Twitter мая 24, 16:21
Казахстан переходит на 2-й этап к демократии http://dlvr.it/QTz5QX

Twitter мая 24, 03:31
Проблемы восприятия информации людишками http://dlvr.it/QTvLgN

Twitter мая 23, 14:09
Поиск причины популярности спиннеров http://dlvr.it/QTqqGv https://twitter.com/f1ashr/status/999291326867820545/photo/1

Twitter мая 23, 13:37
Программа InstagramLiker обновлена http://dlvr.it/QTqdn2

Twitter мая 22, 17:51
Про найм вконтактика http://dlvr.it/QTkc7x

Twitter мая 22, 17:19
Этой осенью "A New Beginning for Mankind.." http://dlvr.it/QTkSGQ https://twitter.com/f1ashr/status/998976610354151424/photo/1

Twitter мая 22, 16:47
В Ступино напечатали первый 3D дом http://dlvr.it/QTkGv5

Twitter мая 22, 15:11
коломенский кремль: альтернативная история 2 http://dlvr.it/QTjlrg https://twitter.com/f1ashr/status/998944561769541634/photo/1

Twitter мая 22, 15:11
Яндекс атаковал Израиль http://dlvr.it/QTjlr0

Twitter мая 22, 14:38
"Добродел" добавлен в http://t30p.ru http://dlvr.it/QTjYqX

Twitter мая 22, 14:38
Перенос коллапса товарооборота в Беларуси на 2018 год http://dlvr.it/QTjYr6

Мой твиттер

Копирайт

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

© Copyright 2008