Реализация oAuth-регистрации в проектах ASP.NET MVC 4 на примере ВКонтакте

| Воскресенье, 2 июня, 2013

Метки: ASP.NET MVC, SimpleMembership, oAuth Комментарии: 0

Реализация oauth-клиента ВКонтакте

Осталось реализовать два метода класса VKontakteAuthenticationClient. Не вдаваясь в подробности приведем этот код:

private string redirectUri;

        void IAuthenticationClient.RequestAuthentication(HttpContextBase context, Uri returnUrl)
        {
            var APP_ID = this.appId;
            this.redirectUri = context.Server.UrlEncode(returnUrl.ToString());
            var address = String.Format(
                    "https://oauth.vk.com/authorize?client_id={0}&redirect_uri={1}&response_type=code",
                    APP_ID, this.redirectUri
                );

            HttpContext.Current.Response.Redirect(address, false);
        }

        class AccessToken
        {
            public string access_token = null;
            public string user_id = null;
        }

        class UserData
        {
            public string uid = null;
            public string first_name = null;
            public string last_name = null;
            public string photo_50 = null;
        }

        class UsersData
        {
            public UserData[] response = null;
        }

        AuthenticationResult IAuthenticationClient.VerifyAuthentication(HttpContextBase context)
        {
            try
            {
                string code = context.Request["code"];

                var address = String.Format(
                        "https://oauth.vk.com/access_token?client_id={0}&client_secret={1}&code={2}&redirect_uri={3}",
                        this.appId, this.appSecret, code, this.redirectUri);

                var response = VKontakteAuthenticationClient.Load(address);
                var accessToken = VKontakteAuthenticationClient.DeserializeJson<AccessToken>(response);

                address = String.Format(
                        "https://api.vk.com/method/users.get?uids={0}&fields=photo_50",
                        accessToken.user_id);

                response = VKontakteAuthenticationClient.Load(address);
                var usersData = VKontakteAuthenticationClient.DeserializeJson<UsersData>(response);
                var userData = usersData.response.First();

                return new AuthenticationResult(
                    true, (this as IAuthenticationClient).ProviderName, accessToken.user_id,
                    userData.first_name + " " + userData.last_name,
                    new Dictionary<string, string>());
            }
            catch (Exception ex)
            {
                return new AuthenticationResult(ex);
            }
        }

        public static string Load(string address)
        {
            var request = WebRequest.Create(address) as HttpWebRequest;
            using (var response = request.GetResponse() as HttpWebResponse)
            {
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    return reader.ReadToEnd();
                }
            }
        }

        public static T DeserializeJson<T>(string input)
        {
            var serializer = new JavaScriptSerializer();
            return serializer.Deserialize<T>(input);
        }
    }

Для проверки приложения, запустим его, зайдем на страницу авторизации. Нажимаем кнопку «ВКонтакте» и регистрируемся.

Комментарии
Никто еще не оставил здесь комментарий.
Войдите, чтобы написать комментарий , или воспользуйтесь формой ниже.
 

Copyright © CodeHint.ru 2013-2019