Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Как получить параметры из URL?

#c_sharp #aspnet #vkontakte_api


При авторизации через API ВКонтакте происходит переадресация на URL вида: 


  http://localhost:58821/Auth#access_token=123456712345123451234512345&expires_in=0&user_id=1234567


Обращение к Request.Url.AbsolutePath, Request.Url.AbsoluteUri или Request.RawUrl
даёт только ссылку на хост. Как я могу получить параметры из данного URL?
Upd.: Вероятно проблема в том что адрес и get параметры разделяются символом '#',
а не '?', поэтому параметры получить не получается. Можно ли как-то получить всю строку?
    


Ответы

Ответ 1



Вы ошиблись при выборе типа авторизации - вам необходимо использовать авторизацию предназначенную не для мобильных приложений(клиентскую), а для сайтов(серверную). При этом, необходимо что бы ваш веб-сервер был доступен извне - если не по домену, то хотя бы по какому-то публичному ip. С localhost серверную авторизацию использовать не получится. Если бы это у вас был клиентский код, то можно было бы добавить себе в проект сборку System.Web и использовать код вроде такого: var uri = new Uri("http://localhost:58821/Auth#access_token=123&expires_in=0&user_id=456"); var fragment = uri.Fragment.TrimStart('#'); // access_token=123&expires_in=0&user_id=456 var access_token = HttpUtility.ParseQueryString(fragment).Get("access_token"); // 123 Однако у вас сайт на ASP.NET, и фрагмент(часть Uri начинающаяся с '#') из серверного кода вы не получите никак - клиентом он не передаётся. В вашем случае использовать авторизацию для мобильных устройств нельзя. Точнее конечно можно выпрашивать у пользователя их настоящие логин/пароль, передавать их вместо пользователя, авторизовывать своё приложение, да сохранять токен - но это плохо попахивает, и обязательно вызовет недоверие у пользователей.

Ответ 2



Два дня убил на то, чтобы решить для себя эту проблему, в итоге решил, правда у меня сервер на java но я думаю это не будет особо большой проблемой для понимания. сервер работает на localhost! итак по шагам: 1 - в vk на странице с настройками приложения нужно включить openAPI и в настройках хостов прописать localhost и страницу на которую будет редирект из метода https://oauth.vk.com/authorize в параметре redirect_uri у меня это выглядит вот так 2 - нужно использовать серверную авторизацию а не клиентскую: ссылка на vk.api т.е. для начала нужно получить code getCode { @Override public String getExactMethod() { return "https://oauth.vk.com/authorize?" + "client_id=" + AppProperty.properties.getProperty("vk.client.id") + "&scope=market" + "&display=popup" + "&redirect_uri=" + AppProperty.properties.getProperty("vk.client.uri.local") + "&response_type=code" + "&v=5.60"; } } таким образом в ответе придет код как обчыный get параметр. я его получаю и обрабатываю в фильтре присваивая константе класса 3 - получив код можно отправлять GET запрос на https://oauth.vk.com/access_token используя HttpClient у меня это выглядит вот так: формирование запроса getAccessToken { @Override public String getExactMethod() { return "https://oauth.vk.com/access_token?" + "client_id=" + AppProperty.properties.getProperty("vk.client.id") + "&client_secret=" + AppProperty.properties.getProperty("vk.client.secure.key") + "&redirect_uri=" + AppProperty.properties.getProperty("vk.client.uri.local") + "&code=" + code; } } где code уже присвоен с прошлого этапа, затем я отправляю сам запрос: public Object sendGetRequest(SimpleRequest request) { HttpGet postRequest = new HttpGet(request.getUri()); JSONObject vkApiJsonResponse = null; try (CloseableHttpClient httpClient = HttpClientBuilder.create().build(); CloseableHttpResponse response = httpClient.execute(postRequest)){ String json_string = EntityUtils.toString(response.getEntity()); vkApiJsonResponse = new JSONObject(json_string); } catch (Exception e) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ошибка.", e.getMessage())); } return vkApiJsonResponse; } в результате которого возвращается JSON объект, который и содержит токен, срок его жизни и user_id, вот пример возвращаемого значения из моего дебага 4 - profit! :) надеюсь это сэкономит кому ни будь пару бессоных ночей/долгих дней. Всем добра!

Ответ 3



Для получения параметров можно использовать QueryString if ( Request.QueryString.AllKeys.Contains("user_id") ) { var id = Request.QueryString["user_id"]; }

Ответ 4



В ASP.NET есть объект Request, который содержит в себе данные, связанные с текущим запросом. В частности, и параметры запроса тоже. Главный способ их получения - это использование свойства QueryString, представляющее собой коллекцию ключей и значений. Можно также использовать индексатор класса Request например так: Request["myparam"] но в случае с индексатором данные по ключу ищутся не только среди параметров url'а, но еще и среди параметров формы, кук и серверных переменных.

Ответ 5



Часть запроса после # (якорь) может не отправляться на сервер. Получить доступ к "якорю" можно на клиенте через javascript и отправить её, например, на сервер для обработки. JavaScript: var hash = window.location.hash.substring(1); JQuery: var hash = $(location).attr('hash').substring(1);

Комментариев нет:

Отправить комментарий