Потребовалось на днях прикрутить uLogin к asp.net сайту, но с ходу найти готовый код как-то не получилось. Определенно кто-то столкнется с данным вопросом…
На мой выбор использовать ли uLogin (обзор на хабре) в своих проектах повлияли некоторые цифры. Не будем вдаваться в авторитетность ресурса, мне, почему-то, этого было достаточно. Сервис достаточно просто и удобно сделан — указываешь адрес своего сайта, выбираешь кнопки нужных провайдеров авторизации и получаешь пару кусков кода, которые нужно разместить на своем сайте. Если html код не особо зависит от того на чем создан сайт, то предлагаемый php код мне как-то не подошел. В итоге получилось то, что получилось :)
Полученный html я разместил на master странице сайта.
- <script src="http://ulogin.ru/js/ulogin.js"></script>
- <div id="uLogin" x-ulogin-params="display=small;optional=email,sex;fields=first_name,last_name,photo;providers=vkontakte,facebook,twitter,odnoklassniki,google;hidden=yandex,mailru,livejournal,openid,liveid;redirect_uri=http%3A%2F%2Fmysite.ru%2Fauth.aspx"></div>
* This source code was highlighted with Source Code Highlighter.
В адресе redirect_uri указано куда пошлют пользователя (с токеном uLogin) после того как он пройдет авторизацию через выбранный им провайдер. Получив token, нужно сходить на uLogin и спросить данные о пользователе.
- string link = string.Format("http://ulogin.ru/token.php?token={0}&host={1}", Request.Form["token"],
- Request.ServerVariables["SERVER_NAME"]);
- WebRequest reqGET = WebRequest.Create(link);
- string answer = "";
- using (WebResponse resp = reqGET.GetResponse())
- {
- using (Stream stream = resp.GetResponseStream())
- {
- if (stream != null)
- using (StreamReader sr = new StreamReader(stream))
- {
- answer = sr.ReadToEnd();
- }
- }
- }
* This source code was highlighted with Source Code Highlighter.
В ответ получаем jSON строку, с которой я решил разделаться следующим образом:
- public class JSONHelper
- {
- public static T Deserialise<T>(string json)
- {
- T obj = Activator.CreateInstance<T>();
- using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
- {
- DataContractJsonSerializer serialiser = new DataContractJsonSerializer(obj.GetType());
- obj = (T)serialiser.ReadObject(ms);
- }
- return obj;
- }
- }
- public class iUser
- {
- public string network { get; set; }
- public string uid { get; set; }
- public string first_name { get; set; }
- public string last_name { get; set; }
- public string email { get; set; }
- public string sex { get; set; }
- public override string ToString()
- {
- return string.Format("network={0},uid={1},first_name={2},last_name={3}", network, uid, first_name, last_name);
- }
- }
* This source code was highlighted with Source Code Highlighter.
У uLogin можно спрашивать еще несколько других атрибутов. Я добавил некоторые в параметр optional чтобы не нервировать пользователя лишними вопросами (допустим ввод email адреса, если провайдер не может передать его)
Осталось десериализовать:
- iUser usr = JSONHelper.Deserialise<iUser>(answer);
* This source code was highlighted with Source Code Highlighter.
Ну, а дальше каждый решает сам что делать с полученными данными. Как пример — положить себе в базу и отправить пользователю куку с токеном, для авторизации на сайте.
Тестировал на своих аккаунтах. Может быть более обширное использование сможет выявить имеющиеся баги.
Надеюсь что решение получилось не только короткое, но и полезное.
Автор: iklementiev