2016-06-15 3 views
0

Я использую шаблон LoginActivity, и я пытаюсь войти на сайт с электронной почтой и паролем, используя стандартный HTTP-запрос. Сайт не предоставляет API, поэтому я думаю о том, чтобы каким-то образом отразить регистрацию сайта, чтобы заполнить поля электронной почты и пароля на странице, а затем отправить запрос на вход.Android LoginActivity, используя стандартный HTTP-запрос

Подумайте о том, чтобы войти в stackoverflow, например, путем ввода текста электронной почты и пароля TextView (ы) и отправки стандартного HTTP-запроса на сервер аутентификации с этими учетными данными точно, как это произойдет в браузере (такие же запросы и адреса).

Я не делал ничего подобного раньше, и я понятия не имею, возможно ли это, поэтому, пожалуйста, простите какое-либо незнание с моей стороны.

ответ

0

Предполагая, что вам нужно войти на такие сайты, как StackOverflow, из вашего приложения со стандартным запросом HTTP. Это просто невозможно. Потому что никакие организации не позволят сторонним сайтам/приложениям обрабатывать учетные данные своих пользователей. Если они намерены поделиться своим ресурсом с третьим лицом, большинство организаций придерживаются следующей процедуры:

  • Сначала они предоставляют api для вас.
  • С помощью этого api вы можете заставить пользователей войти в систему. I.e вы не можете обрабатывать эти учетные данные.
  • Затем они выдают вам токен, соответствующий пользователю.
  • С помощью этого токена вы можете выполнять последующие запросы.

Если организация не предоставляет api, то они, скорее всего, находятся в ситуации, когда сторонним сайтам/приложениям не предоставляется доступ к ресурсам их пользователей.

+0

Данная компания представляет собой небольшой стартап с 14 сотрудниками и очень не имеющий безопасности. Я могу видеть хеши для userID и пароль после входа в источник страницы. –

1

Это делается на Android так же, как в веб-браузере. А именно, вы будете отправлять POST запрос с соответствующими параметрами, скажем, JSON объект для объяснения который содержит что-то вроде:

{ 
    username: 'myUsername' 
    password: 'mypass' 
} 

Это обрабатываются и, если учетные данные являются правильными, вы получите ответ, который может содержать множество данных, среди которых accessToken (его можно назвать небольшим изменением).

Вы должны запомнить этот токен доступа и использовать его для извлечения любых других данных с сайта, поскольку этот токен используется оттуда для аутентификации. У меня есть API, который я лично сделал, и я отправляю accessToken в качестве параметра в каждом запросе ресурса, который недоступен незарегистрированному пользователю.

Что касается технической стороны, я использую отличную библиотеку под названием OkHttp для отправки запросов Http, и это довольно полезно и удобно. Вот фрагмент кода, чтобы увидеть, что я говорю о:

//JSON is a media type for parsing json 
//json is a json string containing payload e.g. username and pass like in the example 
OkHttpClient httpClient = new OkHttpClient(); 
RequestBody body = RequestBody.create(JSON, json); 
    Request request = new Request.Builder() 
      .url(url) 
      .post(body) 
      .build(); 
    Response response = httpClient.newCall(request).execute(); 

Единственное, что осталось, чтобы для Вас, чтобы правильно разобрать response. Вы можете найти различные решения по этой теме, но я лично использую 2 подхода, BufferedReader для огромных ответов, используя response.body().byteStream(), и простой старый String для не очень больших ответов, используя response.body().string().

Это не краткое, но очень подробное объяснение, поэтому не стесняйтесь просить разъяснений, если вы не получите какую-то часть.

+0

Как я понимаю, OkHttp в этом случае просто заменяет HttpPost, правильно? Моя проблема заключается в том, что у меня нет адреса для отправки запроса на аутентификацию, а только на внешнюю страницу. Сервер аутентификации использует хеши доступа userID, которые предоставляются базой SQLite посредством входа в систему, поэтому я не могу отправлять запросы на сервер непосредственно только на страницу с именем пользователя и паролем, после входа в систему я могу получить хэш для моего пользователя со страницы но я не могу сделать это до входа в систему, поэтому я не могу отправить запрос. Мне нужен способ, напоминающий заполнение имени пользователя и пароля на странице, а затем входа в систему. –

+1

Ну, предполагается, что у вас есть учетная запись. Если вы этого не сделаете, сделайте один. Или, если вы спрашиваете, как зарегистрироваться, это очень похоже, один URL-адрес и полезная нагрузка. В общем, все сводится к тому же. – Vucko

+0

Я работаю [reddit is fun] (https://github.com/talklittle/reddit-is-fun/blob/master/src/com/andrewshu/android/reddit/login/LoginTask.java). Я понимаю, как это работает, но проблема в том, что у меня нет эквивалента REDDIT_LOGIN_URL (https://ssl.reddit.com/api/login), поэтому я должен использовать обычную страницу входа (https: // www. reddit.com/login), так как я могу это сделать? –

Смежные вопросы