Как получить пароль вк через android studio
Перейти к содержимому

Как получить пароль вк через android studio

  • автор:

Авторизация в системе с помощью ВК (Android)

Подскажите, пожалуйста, как авторизоваться в системе с помощью социальной сети. Я не могу найти какой-то подробной информации о том, как это правильно сделать. Имеется сервер Java + Spring (Tomcat) и мобильное приложение Android. Вопрос заключается в том, как правильно построить механизм авторизации? Я могу с помощью SDK от ВК авторизовать пользователя на мобильном устройстве, да, но что это мне даёт? Как авторизовать его в системе? Авторизация в ВК даст мне какой-то токен? Который я отправлю на свой сервер, а сервер должен проверить валидность этого токена с помощью того же API от ВК? Где об этом можно почитать? Скажите, как вы решали подобные задачи.

Отслеживать
задан 18 мая 2018 в 19:43
Pasha Oleynik Pasha Oleynik
291 1 1 серебряный знак 9 9 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Здесь есть несколько возможных решений. Я бы сделал как-то так:

  1. На мобиле юзер авторизуется в ВК, получая access_token .
  2. Отсылает токен на сервер.
  3. Сервер по токену получает профиль юзера с API ВК.
  4. Проверяет есть ли такой юзер в БД по его id в ВК.
  5. Если нет — создаёт юзера в своей БД, прописывая его id в ВК в поле таблицы юзеров.
  6. Если юзер такой уже есть или его только что создали — генерирует для него свой токен по логину (например id в ВК) и паролю (пусть это будет случайная строка, генерирующаяся при создании юзера)
  7. Отсылает на мобилу сгенерированный свой токен.
  8. Мобила пишет его в SharedPreferences и использует для запросов к серверу.

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

Отслеживать
ответ дан 18 мая 2018 в 23:29
69.8k 9 9 золотых знаков 67 67 серебряных знаков 124 124 бронзовых знака

VK возвращает access_token — но он действует только с устройства пользователя. Я сейчас столкнулся с такой же проблемой. и не знаю как её решить без направления пользователя в браузер

25 дек 2019 в 20:31

@undermuz, да, есть такая проблема. Пути решения два — авторизовывать через браузер или все данные получать на девайсе и передавать их на сервер. По мне так оба варианта плохи. Однако для юзера будет приятнее второй вариант, т.к. не надо браузер запускать.

ВКонтакте Android SDK

Решили поделиться своими наработками по реализации ВКонтакте API для Android. Данное SDK позволяет быстро авторизоваться и вызывать методы API, например отправить запись на стену, получить список друзей пользователя и многое другое. Изначально библиотека разрабатывалась как ядро проекта Kate Mobile. Совсем недавно пришла идея оформить часть кода в ощедоступную библиотеку. На скорую руку вынести её в отдельный проект и теперь она доступна всем желающим. Сейчас реализованы основные методы API, пополняем по мере необходимости. Будем улучшать на основании полученного фидбэка. Если он будет.

SDK опубликовано на гитхабе https://github.com/thest1/Android-VKontakte-SDK. Распространяется по лицензии MIT. Вы можете её использовать в любых проектах, в том числе коммерческих. Можете её модифицировать. Ссылку на первоисточник желательно размещать по возможности.

Быстро понять принципы работы библиотеки вам поможет демо-проект AndroidVkSdkSample. В нём реализована авторизация и, в качестве примера, отправка записи на свою стену.

Чтобы подключить библиотеку к своему проекту, нужно выполнить следующие шаги:

  1. Импортировать проект AndroidVkSdk в Eclipse. AndroidVkSdk реализован как Android Library Project.
  2. Добавить в своём проекте ссылку на AndroidVkSdk.
  3. Убедиться что у вашего приложения есть разрешение на доступ в Интернет

String url=Auth.getUrl(API_ID, Auth.getSettings()); webview.loadUrl(url); 
String[] auth=Auth.parseRedirectUrl(url); 
API api=new Api(access_token, API_ID); 
api.createWallPost(user_id, text, null, null, false, false, false, null, null); 

Авторизация ВКонтакте через WebView в Android приложении

Здравствуй дорогой друг, в этой статье, на простом примере мы рассмотрим, каким образом можно реализовать авторизацию и использование api социальной сети «ВКонтакте» без подключения официального SDK. Пример приложения можно скачать на github по ссылке в конце статьи.

Создаем проект, подключаем зависимости

В проекте я буду использовать kotlin, mvvm, binding, navgraph подразумевается, что ты уже знаешь, что это такое 🙂

Создаем новый проект на основе Empty Activity, я назову его OAuthWithVK_Example

Создание нового проекта

Добавляем в зависимости.

implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1' implementation 'androidx.navigation:navigation-ui-ktx:2.4.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
Создаем необходимые классы и файлы

Создадим класс «App» расширяющий «Application», он будет представлять наше приложение и содержать экземпляр «AccountService» для хранения токена и экземпляр «Retrofit» с url для запросов к ВК api. Через companion object будем получать доступ к App и созданным экземплярам. По хорошему это нужно делать через DI, но для простоты примера сделаем так.

/** * Представляет приложение. */ class App : Application() < /** * Возвращает или устанавливает сервис хранения настроект. */ lateinit var accountService: IAccountService /** * Возвращает или устанавливает экземпляр ретрофита. */ lateinit var retrofit: Retrofit companion object < lateinit var application: App >override fun onCreate() < super.onCreate() application = this accountService = VKAccountService(getSharedPreferences("vk_account", MODE_PRIVATE)) retrofit = Retrofit.Builder() .baseUrl("https://api.vk.com/method/") .addConverterFactory(ScalarsConverterFactory.create()) .build() >>

Создадим интерфейс «IAccountService» и его реализацию «VKAccountService», сервис будет предоставлять возможность сохранять и получать token и userId.

/** * Определяет интерфейс получения и установки параметров аккаунта. */ interface IAccountService < /** * Возвращает или устанавливает токен. */ var token: String? /** * Возвращает или устанавливает идентификатор пользователя. */ var userId: String? >

Класс VKAccountService

/** * Представляет сервис сохранения пользовательских настроек. * @param sharedPreference Класс записи пользовательских настроек. */ internal class VKAccountService( private val sharedPreference: SharedPreferences ) : IAccountService < private val TOKEN = "token" private val USER_ID = "userId" companion object < const val SCOPE = "friends,stats" >override var token: String? get() < return sharedPreference.getString(TOKEN, null) >set(value) < with(sharedPreference.edit()) < if (value == null) < remove(TOKEN) >else < putString(TOKEN, value) >apply() > > override var userId: String? get() < return sharedPreference.getString(USER_ID, null) >set(value) < with(sharedPreference.edit()) < if (value == null) < remove(USER_ID) >else < putString(USER_ID, value) >apply() > > >

Создадим класс активити с именем «MainActivity» и соответствующий ему файл разметки «activity_main». Он будет содержать FragmentContainerView для навигации.

/** * Представляет основное активити приложения. */ class MainActivity : AppCompatActivity() < private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) setSupportActionBar(binding.toolbar) val navController = (supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment).navController appBarConfiguration = AppBarConfiguration(navController.graph) setupActionBarWithNavController(navController, appBarConfiguration) >override fun onSupportNavigateUp(): Boolean < val navController = findNavController(R.id.nav_host_fragment) return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() >>

Файл разметки activity_main

Обновим файл манифеста, указав корневое активити.

Для навигации по фрагментам понадобится файл «nav_graph».

Теперь создадим первый класс фрагмента для авторизации, назовем его «AuthFragment». Здесь нам нужен только виджет WebView, который создадим программно. Для открытия окна авторизации нужен url с параметрами, создаем приватное поле с именем «_authParams», оно будет содержать строку с необходимой конфигурацией, далее передадим ее в WebView. В методе onViewCreated будем открывать окно аутентификации, реагировать на события ‘Подтверждение разрешений’, ‘Ошибка ввода логина/пароля’, ‘Успех’ и др. В коде я оставил TODO куда нужно будет вставить ваш client_id приложения, как его получить рассмотрим в конце статьи.

/** * Представляет фрагмент 'Войти в аккаунт'. */ class AuthFragment : Fragment() < private val webview by lazy < WebView(context!!) >private val _authParams = StringBuilder("https://oauth.vk.com/authorize?").apply < append(String.format("%s=%s", URLEncoder.encode("client_id", "UTF-8"), URLEncoder.encode(/*TODO Сюда вставить id приложения созданного в ВК в разделе "Developers"*/, "UTF-8")) + "&") append(String.format("%s=%s", URLEncoder.encode("redirect_uri", "UTF-8"), URLEncoder.encode("https://oauth.vk.com/blank.html", "UTF-8")) + "&") append(String.format("%s=%s", URLEncoder.encode("display", "UTF-8"), URLEncoder.encode("mobile", "UTF-8")) + "&") append(String.format("%s=%s", URLEncoder.encode("scope", "UTF-8"), URLEncoder.encode(VKAccountService.SCOPE, "UTF-8")) + "&") append(String.format("%s=%s", URLEncoder.encode("response_type", "UTF-8"), URLEncoder.encode("token", "UTF-8")) + "&") append(String.format("%s=%s", URLEncoder.encode("v", "UTF-8"), URLEncoder.encode("5.131", "UTF-8")) + "&") append(String.format("%s=%s", URLEncoder.encode("state", "UTF-8"), URLEncoder.encode("12345", "UTF-8")) + "&") append(String.format("%s=%s", URLEncoder.encode("revoke", "UTF-8"), URLEncoder.encode("1", "UTF-8"))) >.toString() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ) = webview override fun onViewCreated(view: View, savedInstanceState: Bundle?) < super.onViewCreated(view, savedInstanceState) if (App.application.accountService.token == null) < webview.webViewClient = AuthWebViewClient(context!!) < status ->when(status) < AuthStatus.AUTH -> < >AuthStatus.CONFIRM -> < >AuthStatus.ERROR -> < Toast.makeText(context, "Не верный логин или пароль", Toast.LENGTH_LONG).show() >AuthStatus.BLOCKED -> < showAuthWindow() Toast.makeText(context, "Аккаунт заблокирован", Toast.LENGTH_LONG).show() >AuthStatus.SUCCESS -> < val url = webview.url!! val tokenMather = Pattern.compile("access_token=\\w+").matcher(url) val userIdMather = Pattern.compile("user_id=\\w+").matcher(url) // Если есть совпадение с патерном. if (tokenMather.find() && userIdMather.find()) < val token = tokenMather.group().replace("access_token=".toRegex(), "") val userId = userIdMather.group().replace("user_id=".toRegex(), "") // Если токен и id получен. if (token.isNotEmpty() && userId.isNotEmpty()) < App.application.accountService.token = token App.application.accountService.userId = userId navigateToInfo() >> > > > > else < navigateToInfo() >> override fun onStart() < super.onStart() if (App.application.accountService.token == null) < showAuthWindow() >> private fun showAuthWindow() < CookieManager.getInstance().removeAllCookies(null) webview.loadUrl(_authParams) >private fun navigateToInfo() < findNavController().navigate(R.id.action_AuthFragment_to_InfoFragment) >>

В зависимости от того какое событие сейчас происходит (ввод пароля, ошибка, заблокированный аккаунт), текущий url у WebView будет изменяться, на основе этого будем определять текущий статус аутентификации. Для этого создадим класс «AuthWebViewClient» расширяющий «WebViewClient», переопределим метод onPageFinished в котором будем парсить текущую открытую ссылку.

/** * Представляет WebView клиент. * @param context Контекст. * @param onStatusChange Обработчик смены статуса аутентификации. */ class AuthWebViewClient( private val context: Context, private val onStatusChange: (status: AuthStatus) -> Unit ) : WebViewClient() < private var _currentUrl = "" override fun shouldOverrideUrlLoading(wv: WebView, url: String): Boolean < wv.loadUrl(url) return true >override fun onPageFinished(wv: WebView, url: String) < if (_currentUrl != url) < val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager //если открыто окно аутентификации. if (url.contains("https://oauth.vk.com/authorize")) < val scope = URLEncoder.encode(VKAccountService.SCOPE, "UTF-8") // Если открыто окно ввода логина и пароля. if (url.contains(scope)) < imm.showSoftInput(wv, 0) wv.visibility = View.VISIBLE onStatusChange(AuthStatus.AUTH) >// Если открыто окно подтверждения разрешений. if (url.contains("q_hash")) < onStatusChange(AuthStatus.CONFIRM) >// Если открыто окно с сообщением об неверно введеном пароле. if (url.contains("email")) < onStatusChange(AuthStatus.ERROR) >> // Если открыто окно заблокированного пользователя. if (url.contains("https://m.vk.com/login\\?act=blocked")) < onStatusChange(AuthStatus.BLOCKED) >// Если открыто окно для считывания токена. if (url.contains("https://oauth.vk.com/blank.html")) < wv.visibility = View.INVISIBLE onStatusChange(AuthStatus.SUCCESS) >> _currentUrl = url > >

Перечислим статусы аутентификации в enum, который назовем «AuthStatus», этот enum будем передаваться кэлбеком из класса AuthWebViewClient во фрагмент.

/** * Перечисляет статусы аутентификации клиента. */ enum class AuthStatus < /** * Статус ввода логина и пароля. */ AUTH, /** * Статус подтверждения разрешений. */ CONFIRM, /** * Статус завершения авторизации с ошибкой. */ ERROR, /** * Статус заблокированного пользователя. */ BLOCKED, /** * Статус успешного завершения авторизации. */ SUCCESS >

После верного ввода логина/пароля и подтверждения разрешений, будет получен и записан в память токен и идентификатор пользователя. С фрагментом аутентификации на этом все.

Приступим к созданию второго фрагмента, здесь мы сделаем всего 1 запрос на получение списка друзей. На экране покажем кнопку для выхода, textview для показа кол-ва друзей и скролящийся textview для показа списка друзей.

Создадим фрагмент с именем «InfoFragment» и соответствующий ему xml файл с разметкой «info_fragment».

/** * Представляет фрагмент 'Инфо'. */ class InfoFragment : Fragment() < private val _viewModel: InfoViewModel by viewModels() private var _binding: InfoFragmentBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View < _binding = InfoFragmentBinding.inflate(inflater, container, false) return binding.root >override fun onViewCreated(view: View, savedInstanceState: Bundle?) < super.onViewCreated(view, savedInstanceState) with(binding) < lifecycleOwner = this@InfoFragment.viewLifecycleOwner vm = _viewModel tvFriends.movementMethod = ScrollingMovementMethod() logout.setOnClickListener < App.application.accountService.token = null App.application.accountService.userId = null findNavController().navigate(R.id.action_InfoFragment_to_AuthFragment) >> > override fun onDestroyView() < super.onDestroyView() _binding = null >>

Файл разметки info_fragment

     '/> " android:layout_marginVertical="16dp" android:scrollbars="vertical"/> 

Запрос на список друзей будем делать во ViewModel, эту вью модель передадим в биндинг, LiveData сама будет устанавливать данные в TextView.

/** * Определяет модель представления фрагмента 'Инфо'. */ class InfoViewModel: ViewModel() < private val _count = MutableLiveData() private val _friends = MutableLiveData() /** * Возвращает кол-во друзей. */ val count: LiveData = _count /** * Возвращет список друзей. */ val friends: LiveData = _friends init < viewModelScope.launch < val response = App.application.retrofit.create(FriendsGetRequest::class.java).friendsGet( App.application.accountService.token. "5.131", "name" ) val friendsList = StringBuilder() val items = JSONObject(response).getJSONObject("response").getJSONArray("items") for (i in 0 until items.length()) < friendsList.append( "$$\n" ) > _count.postValue(JSONObject(response).getJSONObject("response").getString("count")) _friends.postValue(friendsList.toString()) > > >

Осталось написать интерфейс «FriendsGetRequest» с запросом для ретрофит и на этом с программной частью будем заканчивать 🙂

/** * Определяет запрос друзей пользователя. */ interface FriendsGetRequest < /** * Возвращает json со списком друзей. */ @GET("friends.get") suspend fun friendsGet( @Query("access_token") token: String, @Query("v") v: String, @Query("fields") fields: String ): String >

Теперь разберемся, как получить client_id, это один из параметров запроса на авторизацию, его выдает ВК для понимания, какое приложение собирается обращаться к его api. Что бы его получить зайдите на свою страницу ВК и найдите меню «Управление», если его нет в списке, нужно добавить его в настройках страницы.

Кликнув по меню «Управление» мы попадем в раздел «Мои приложения», для создания нового приложения нажмите кнопку «Создать»

Раздел «Мои приложения»

В открывшемся окне укажите название приложения и выберите тип «Standalone-приложение» далее жмем кнопку «Подключить приложение». После нажатия на кнопку, вам придет смс на подключенный к странице номер.

Когда приложение будет создано перейдите в меню «Настройки», там будет указан client_id, который нужно вставить в код на место TODO, все остальные настройки по желанию 🙂

Меню настройки приложения

SDK Вконтакте Android. Нужно получить информацию о пользователях с помощью метода ВК API users.get

У меня в приложении пользователь авторизуется в ВК с помощью метода VK.login(this, list); и получает объект VKAccessToken . Как используя SDK методы я теперь могу послать запрос users.get и в каком виде приходит ответ?

Отслеживать
49.3k 17 17 золотых знаков 57 57 серебряных знаков 101 101 бронзовый знак
задан 5 мар 2021 в 17:42
Yulya Ulyanova Yulya Ulyanova
85 6 6 бронзовых знаков
А в документации не написано?
5 мар 2021 в 17:43

написано, но там на языке Kotlin, а я пока ещё только Java изучаю ( и гугл как назло ничего не выдаёт

5 мар 2021 в 17:45
vk.com/dev/Java_SDK и vk.com/dev/android_sdk Никаких котлинов не вижу
5 мар 2021 в 17:48

первая ссылка это Java а мне нужно для Java Android, я так поняла там разные SDK, а по второй ссылке там всё на Kotlin

5 мар 2021 в 17:50

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

В общем пришлось мне книгу про Kotlin прочитать что бы разобраться. Когда мы получили токен и хотим отправить запрос то нужно создать объект с запросом. В Java это выглядит так

VKRequest vkRequest = new VKRequest("likes.add").addParam("type","post").addParam("owner_id",227420921).addParam("item_id", 21374).addParam("access_key", vkAccessToken.getAccessToken()).addParam("v", "5.130"); 

Создаём объект VKRequest и при создании в конструктор закидываем сам метод, а дальше с помощью методов addParam закидываем в объект параметры для запроса. В примере мы хотим поставить лайк на стене пользователя. vkAccessToken.getAccessToken() — тут мы указываем токен полученный ранее.

После того как мы получили объект vkRequest нужно его отправить на сервак, это делается с помощью метода VK.execute()

 VK.execute(vkRequest, new VKApiCallback() < @Override public void success(Object o) < //какие то действия с полученной информацией >@Override public void fail(@NotNull VKApiExecutionException e) < //какие то действия с полученной информацией >>); 

В метод VK.execute() мы запихиваем созданный нами объект и анонимный класс в котором переопределяем методы. Эти методы будут вызываться после того как сервер обработает запрос. success вызывается когда запрос обработан и получен ответ, а fail в случае если произошла ошибка при отправке запроса.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *