AndrewShmig / Vkontakte-iOS-SDK-LV

[iOS] Powerful & flexible Vkontakte iOS SDK Latest Version
79 stars 23 forks source link

Неверный токен при действии с другого айпи адреса #33

Closed yarchiko closed 10 years ago

yarchiko commented 11 years ago

авторизовался и получил токен. сделал пост на стену. все ок. айпи адрес сменился, делаю пост на стену, возвращается ошибка от вк: "error_msg" = "User authorization failed: access_token was given to another ip address.";

из логов: 2013-09-26 22:08:14.247 New token: { "Creation time" = 1380218891; "Expiration time" = 1380305291; Permissions = ( photos, wall, friends ); Token = e40ce65a8ae568248ac6b70b71481eca2c3582c912864db025927e99f7bf4fb1bcb41eac728c3ef7c8c07; "User ID" = 1; }

2013-09-26 22:08:16.316 [VKUser currentUser].accessToken.userID 933248fad0d4ae1e9ae309cfe2b2a377cde392a11e0c607ee475395061c0272803c84890c0aa3edfa97d0

2013-09-26 22:08:18.702 [VKRequest connectionDidFinishLoading:] $0 = 0x0ab28770 { error = { "error_code" = 5; "error_msg" = "User authorization failed: access_token was given to another ip address."; "request_params" = ( { key = oauth; value = 1; }, { key = method; value = "wall.post"; }, { key = "access_token"; value = 933248fad0d4ae1e9ae309cfe2b2a377cde392a11e0c607ee475395061c0272803c84890c0aa3edfa97d0; }, { key = message; value = test; }, { key = "owner_id"; value = 1; } ); }; }

AndrewShmig commented 11 years ago

Интересная ошибка, раньше на такую не натыкался. Мне кажется ВК это специально сделали для защиты от "перехватов" токенов доступа. Поэтому при смене айпишника надо обновлять токен доступа.

AndrewShmig commented 11 years ago

Читаем: https://vk.com/topic-1_24428376?post=64184 И всё, что здесь: http://yandex.ru/yandsearch?lr=192&text=User+authorization+failed%3A+access_token+was+given+to+another+ip+address

yarchiko commented 11 years ago

да скорее всего. просто в vlrequest надо это как-то обрабатывать. вот я к чему)

AndrewShmig commented 11 years ago

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

yarchiko commented 11 years ago

ок, понял. думаю, что надо просить пользователя повторно авторизоваться в таких случаях.

AndrewShmig commented 11 years ago

@yarchiko либо просто запрашивать offline права.

yarchiko commented 11 years ago

@AndrewShmig да. но в обсуждении, которое Вы скинули, пишут, что это может быть неправильно. https://vk.com/topic-1_24428376?post=64196

в любом случае спасибо) смотрю Ваш ASASocialServices, он сейчас поддерживается? нужен фейсбук для иос 5.

AndrewShmig commented 11 years ago

@yarchiko зато выход из ситуациии :) Нет, уже не поддерживается. Баги править буду, а вот допиливать нет.

Nikaladze commented 10 years ago

@AndrewShmig тоже столкнулся с этим вопросом и вот, что обнаружил - токен обновляется, но при любом первом запросе (у меня LongPoll), вижу что передается старый токен: 2014-04-10 10:53:45.518 Flips[10617:60b] -[AppDelegate VKConnector:webViewDidStartLoad:] 2014-04-10 10:53:57.612 Flips[10617:60b] -[AppDelegate VKConnector:webViewDidFinishLoad:] 2014-04-10 10:54:00.357 Flips[10617:60b] -[AppDelegate VKConnector:accessTokenRenewalSucceeded:] 2014-04-10 10:54:00.361 Flips[10617:60b] Access token: { "Creation time" = ... Token = 8d65dc137fb05e065805c600522d0527d194862a56afdddba1aa21589459c78f1698729d996680d33a741; "User ID" = ...; } 2014-04-10 10:58:33.676 Flips[10617:60b] -[AppDelegate VKConnector:willHideWebView:] 2014-04-10 10:58:33.760 Flips[10617:3807] void SendDelegateMessage(NSInvocation *): delegate (webView:didFinishLoadForFrame:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode 2014-04-10 10:58:36.537 Flips[10617:60b] -[WebService VKRequest:totalBytes:downloadedBytes:] 2014-04-10 10:58:36.539 Flips[10617:60b] 263 394 2014-04-10 10:58:36.542 Flips[10617:60b] -[WebService VKRequest:responseErrorOccured:] 2014-04-10 10:58:36.544 Flips[10617:60b] error: { "error_code" = 5; "error_msg" = "User authorization failed: access_token was given to another ip address."; "request_params" = ( { key = oauth; value = 1; }, { key = method; value = "messages.getLongPollServer"; }, { key = "access_token"; value = 38cb7d16ef7cdac9993c3f09b6e29ef2c2f4725e110d362a2f9b9a224ffe961eec8c1220ebe9a97ab9b05; }, ... ); }

Как только перезапускаю приложение все работает нормально. Когда делаю запрос: VKRequestManager *rm = [[VKRequestManager alloc] initWithDelegate:self user:[VKUser currentUser]]; И смотрю в дебагере, что в передается новый токен, но когда делаю Print Description user-а получаю старый (см. на рис.): 2014-04-10 10 57 47 copy

AndrewShmig commented 10 years ago

@Nikaladze, хмм... надо посмотреть будет. Есть возможность исходный код рабочего участка скинуть, с помощью которого я смогу воспроизвести ошибку?

Есть подозрение, что связано это с юзердефолтами и хранилищем.

Nikaladze commented 10 years ago

@AndrewShmig хотел сделать в виде sample, но что-то проделал все тоже самое и токен не обновляется вообще... странно, наверное что-то пропустил

AndrewShmig commented 10 years ago

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


С уважением, Шмиг Андрей Андреевич

Skype: sky-dos Email: andrewshmig@yandex.ru

On Apr 10, 2014, at 3:02 PM, Nikaladze notifications@github.com wrote:

@AndrewShmig хотел сделать в виде sample, но что-то проделал все тоже самое и токен не обновляется вообще... странно, наверное что-то пропустил

— Reply to this email directly or view it on GitHub.

Nikaladze commented 10 years ago

Обязательно

Nikaladze commented 10 years ago

@AndrewShmig Sample послал Вам на почту с описанием шагов для воспроизведения проблемы

AndrewShmig commented 10 years ago

Получил. Спасибо большое, будем разбираться.


С уважением, Шмиг Андрей Андреевич

Skype: sky-dos Email: andrewshmig@yandex.ru

On Apr 10, 2014, at 6:17 PM, Nikaladze notifications@github.com wrote:

Sample послал Вам на почту с описанием шагов для воспроизведения проблемы

— Reply to this email directly or view it on GitHub.

ichina commented 10 years ago

сорри, что поднимаю снова эту тему, чтонибудь решилось в проблеме обновления токена при сменившемся ip?

AndrewShmig commented 10 years ago

@ichina и да, и нет. Была исправлена ошибка про которую выше писали, касалась она обновления токена доступа после инвалидации его. Если речь о механизме каком-то дополнительном, то нет. Собственно, не представляю пока, что можно сделать, чтобы проблем с инвалидацией токена доступа не было после смены айпишника, кроме как повторно вызвать окно авторизации и, если никаких пользовательских действий не требуется, обновить токен без отображения UIWebView.

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

ichina commented 10 years ago

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

AndrewShmig commented 10 years ago

Подумаем над этим. Будет ли по сути реализация такой очереди решать реальные проблемы, а не выдуманные.


С уважением, Шмиг Андрей Андреевич

Skype: sky-dos Email: andrewshmig@yandex.ru

On Apr 28, 2014, at 11:03 PM, ichina notifications@github.com wrote:

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

— Reply to this email directly or view it on GitHub.

ichina commented 10 years ago

эта очередь будет очень уместна и полезна в случае если проблема смены ip решится на стороне сдк.

AndrewShmig commented 10 years ago

@ichina пожалуй надо будет этим вопросом заняться. А как по вашему должна работать эта очередь для программиста? Должен ли он явно запускать "провалившиеся" запросы в очереди и иметь возможность отменить какие-то из них, или же всё должно быть полностью невидимо для программиста и все запросы после обновления токена должны выполниться?

ichina commented 10 years ago

Я реализовывал такую вещь с помощью очередей операций NSOperationQueue. пока проблема возобновления токена решается сдкашкой, мы просто останавливаем выполнение операций в очереди, и все провалившиеся запросы закидываем в конец очереди, тем самым у нас начинают накапливаться операции запросов в очереди. когда сдк решит проблему с токеном мы просто включаем выполнение очереди (тоесть просто переключаем булово свойство "isSuspended" у NSOperationQueue) и все запросы начинают переотправляться. ну и наверн нужно будет пробежаться по всем этим запросам и обновить токены

AndrewShmig commented 10 years ago

@ichina да, я примерно в таком же ключе думал. Надо проектировать, смотреть. Будем делать.