7even / vkontakte_api

Ruby-адаптер для ВКонтакте API
http://7even.github.com/vkontakte_api
MIT License
283 stars 68 forks source link

friends.get и авторизация через OmniAuth #12

Closed exAspArk closed 11 years ago

exAspArk commented 11 years ago

Привет,

Я использую авторизацию через OmniAuth + Devise, пользователь успешно авторизуется, получая access_token вида:

{
       "provider" => "vkontakte",
            "uid" => 11111,
           "info" => {
              "name" => "Иван Петров",
          "nickname" => "лолка",
        "first_name" => "Иван",
         "last_name" => "Петров",
             "image" => "http://cs9641.userapi.com/u11111/e_204f2538.jpg",
          "location" => "Russia, ",
              "urls" => {
            "Vkontakte" => "http://vk.com/asdf"
        }
    },
    "credentials" => {
             "token" => "2e1263aa122aae2342e112886050242c802dfaee759655574f21021920294a88c5010b3db02b62afc42",
        "expires_at" => 1359197000,
           "expires" => true
    },
          "extra" => {
        "raw_info" => {
                    "uid" => 11111,
             "first_name" => "Иван",
              "last_name" => "Петров",
               "nickname" => "лолка",
            "screen_name" => "asdf",
                    "sex" => 2,
                   "city" => "0",
                "country" => "1",
                 "online" => 0,
                  "photo" => "http://cs9641.userapi.com/u11111/e_204f2538.jpg",
              "photo_big" => "http://cs9641.userapi.com/u11111/a_748e6381.jpg"
        }
    }
}

После чего создаю клиент для ВК, передавая этот токен:

@vk = VkontakteApi::Client.new(access_token)

При попытке получить список друзей

@friends = @vk.friends.get(fields: [:first_name, :last_name, :screen_name])

Получаю ошибку

VKontakte returned an error 113: 'Invalid user id' after calling method 'friends.get' with parameters {"fields"=>"first_name,last_name,screen_name"}.

Понятно, что не передается uid. Если передать его вот так

@friends = @vk.friends.get(uid: current_user.uid, fields: [:first_name, :last_name, :screen_name])

То получаю ошибку

VKontakte returned an error 7: 'Permission to perform this action is denied' after calling method 'friends.get' with parameters {"uid"=>"13610681", "fields"=>"first_name,last_name,screen_name"}.

В настройках приложения запрашиваю через scope права на 'friends'. Согласно VK API uid параметр вообще не обязателен (тогда будет список друзей авторизованного юзера). Мне кажется, какая-то проблема с access_token при инициализации клиента.... Подскажите, как исправить?

7even commented 11 years ago

Нужно понять, какие права есть у токена (@vk.scope), и что пишется в лог при запросе friends.get.

exAspArk commented 11 years ago

При вызове

# вызов метода
@vk.scope

# логи
POST https://api.vk.com/method/getUserSettings
body: ""
{"error":{"error_code":113,"error_msg":"Invalid user id","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"getUserSettings"}]}}

# на странице
VkontakteApi::Error (VKontakte returned an error 113: 'Invalid user id' after calling method 'getUserSettings' without parameters.)

При вызове

# вызов метода
@vk.friends.get(fields: [:first_name, :last_name, :screen_name])

# логи
POST https://api.vk.com/method/friends.get
body: "fields=first_name%2Clast_name%2Cscreen_name"
{"error":{"error_code":113,"error_msg":"Invalid user id","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"friends.get"},{"key":"fields","value":"first_name,last_name,screen_name"}]}}

# на странице
VkontakteApi::Error (VKontakte returned an error 113: 'Invalid user id' after calling method 'friends.get' with parameters {"fields"=>"first_name,last_name,screen_name"}.):
7even commented 11 years ago

Все говорит о том, что в запросах токен не передается, т.е. @vk просто не авторизован.

В этой строчке:

@vk = VkontakteApi::Client.new(access_token)

access_token должен содержать строку с токеном, тогда все заработает.

exAspArk commented 11 years ago

О, благодарю за столь скорую помощь! Передача самого значения token действительно помогла.

@vk = VkontakteApi::Client.new(access_token.credentials.token)

Можно закрывать issue и ставить star gem'у -)