Ошибка oauth error code is invalid or expired

PHP:

<?php

if (!empty($_SESSION['user'])) {
    header("Location: /account/earn/links");
}

$time = time();
$data = array();

$config = new config();

$ip = func::clear($_SERVER['REMOTE_ADDR']);
$meta =func::clear($_SERVER['HTTP_USER_AGENT']);

$vk_url = 'http://oauth.vk.com/authorize';

$vk_params = array(
    'client_id' => $config->vk_client_id,
    'redirect_uri' => $config->vk_redirect_uri,
    'scope' => 'email,photos',
    'response_type' => 'code'
);

$data['vk_auth'] = $vk_url . "?" . urldecode(http_build_query($vk_params));

if (isset($_GET['code'])) {
    $result = false;

    $vk_params = array(
        'client_id' => $config->vk_client_id,
        'client_secret' => $config->vk_client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $config->vk_redirect_uri
    );
      //ВОТ ДО СЮДА ДОХОДИТ, А ДАЛЬШЕ НЕ ИДЁТ***
    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(https_build_query($vk_params))), true);

    if (isset($token['access_token'])) {
        $vk_params = array(
            'user_ids' => $token['user_id'],
            'fields' => 'user_id,first_name,last_name,photo_100',
            'access_token' => $token['access_token']
        );

        $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get?&v=5.0' . '?' . urldecode(http_build_query($vk_params))), true);
        if (isset($userInfo['response'][0]['id'])) {
            $userInfo = $userInfo['response'][0];
            $result = true;
        }
    }

    if ($result) {

        $uid = $userInfo['id'];
        $email = $token["email"];
        $first_name = $userInfo['first_name'];
        $last_name = $userInfo['last_name'];
        $screen_name = $first_name . ' ' . $last_name;
        $photo_100 = $userInfo['photo_100'];

        $ref_1 = 0;
 

        $db->Query("SELECT * FROM users WHERE uid = '{$uid}'");
        $user_data = $db->FetchArray();
        
 
        if($user_data['ban'] == '2'){
            die(header('location: /ban'));
        }
        $db->Query("SELECT * FROM lider WHERE id = '1'");
$lider_data = $db->FetchArray();
$lider = $lider_data['user_id'];


$ref_1 = $lider;
$ref_2 = 0;
$ref_3 = 0;
        if (isset($_COOKIE['referer']) && !empty($_COOKIE['referer'])) {
            $ref = func::clear($_COOKIE['referer'], 'int');

            $db->Query("SELECT * FROM users WHERE id = '{$ref}'");
            if ($db->NumRows() > 0) {
                $db->Query("SELECT * FROM users_ref WHERE user_id = '{$ref}'");
                $ref_dat = $db->FetchArray();
                
                
                    $ref_1 = $ref;
                
                
                $db->Query("UPDATE users SET refs = refs + 1 WHERE id = '{$ref_1}'");
            }
        }

        $db->Query("SELECT id, uid FROM users WHERE uid = {$uid}");
        if ($db->NumRows() > 0) {
            $user = $db->FetchArray();
            $id = $user['id'];
            $_SESSION['user'] = $id;
            $db->Query("INSERT INTO auth (user_id,ip,time,meta) VALUES ('{$id}','{$ip}','{$time}','{$meta}')");
            $db->Query("UPDATE users SET email = '{$email}', screen_name = '{$screen_name}', photo_100 = '{$photo_100}', ip = '{$ip}' WHERE id = '{$id}'");
            header('location: /account/earn/links');
        } else {
            if (isset($_COOKIE['httpref'])) {
                $httpref = func::clear($_COOKIE['httpref']);
            } else $httpref = '0';
            
            
            $db->Query("INSERT INTO users (uid,email,screen_name,photo_100,ip,date_reg)
        VALUES ('{$uid}','{$email}','{$screen_name}','{$photo_100}','{$ip}','{$time}')");
            $id = $db->LastInsert();
            $db->Query("INSERT INTO users_conf (user_id,httpref) VALUES ('{$id}','{$httpref}')");
            $db->Query("INSERT INTO users_ref (user_id,ref_1,to_ref_1)
        VALUES ('{$id}','{$ref_1}','0')");
            $_SESSION['user'] = $id;

            $db->Query("INSERT INTO auth (user_id,ip,time,meta) VALUES ('{$id}','{$ip}','{$time}','{$meta}')");

            header('location: /account/earn/links');
        }
    }
}

$ok_url = 'http://www.odnoklassniki.ru/oauth/authorize';
$ok_params = array(
    'client_id'     => $config->ok_client_id,
    'response_type' => 'code',
    'redirect_uri'  => $config->ok_redirect_uri
);

$data['ok_auth'] = $ok_url . '?' . urldecode(http_build_query($ok_params));

$fb_url = 'https://www.facebook.com/v2.11/dialog/oauth';

$fb_params = array(
    'client_id'     => $config->fb_client_id,
    'redirect_uri'  => $config->fb_redirect_uri,
    'response_type' => 'code',
    'scope'         => 'email'
);

$data['fb_auth'] = $fb_url.'?'.urldecode(http_build_query($fb_params));

new gen('login', $data);

При получении access_token истекает время действия кода, при чем когда делаешь запрос через ajax. Если просто перейти по урлу, то я вижу этот токен. В чем проблема, учитывая то, что этот код, как написано в доках живет час?

  • oauth
  • ajax
  • javascript
  • вконтакте

Sleeping Owl's user avatar

Sleeping Owl

1411 золотой знак2 серебряных знака9 бронзовых знаков

задан 26 апр 2013 в 3:25

Иво's user avatar

ИвоИво

211 серебряный знак3 бронзовых знака

1

  • Вы для чего получаете access_token?

    17 окт 2015 в 22:12

1 ответ

Deleted's user avatar

Deleted

3711 золотой знак5 серебряных знаков13 бронзовых знаков

ответ дан 26 апр 2013 в 5:41

Quiss's user avatar

QuissQuiss

9641 золотой знак14 серебряных знаков27 бронзовых знаков

1

  • Не знаю, что и сказать, потому что с одной стороны это решение для сервер-сайд. А с другой стороны для меня работает такой вариант: oauth.vk.com/… Т.е. я миную получение code

    26 апр 2013 в 6:21

Токены действуют 1 год и получаете вы его или обновляете процедура одинаковая и бесполезная. Но т.к. Яндекс это мегакорпорация Русского масштаба, то приходится мириться с этим хаосом и просто работать по инструкции. Кстати Инструкции штука полезная.

Итак вы получили в логах:

Array
(
[code] => 403
[response] => {«error_message»:»Used OAuth token is invalid or expired»,»error_code»:»INVALID_OAUTH_TOKEN»}
)

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

Как переполучить токен ?

  1. Создавая новое приложение получаем id https://oauth.yandex.ru/
  2. Идем по адресу oauth.yandex.ru/authorize?response_type=token&client_id=ID_приложения
  3. там все разрешаем и получаем Токен на 1 год, все

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

Ну и сказать пару слов о Опишечке Вебмастера и Метрики Яндекс, да и других сервисов..
Это прекраснейшая вещь. Не зарастет тропа любви к Яндексу.

  • yarkov

Приложение в виде сайта.
Делаю авторизацию как по гайду
Стопорюсь на получение токена пишет:

{"error":"invalid_grant","error_description":"Code is invalid or expired."}

Моя ссылка:

https://oauth.vk.com/access_token?client_id=мойид&client_secret=мойключ&redirect_uri=мойурл&code=257db363d39654cac7

Перерыл весь гугл так и ненашёл ответа. Подскажите в чём проблема.


  • Вопрос задан

    более трёх лет назад

  • 2490 просмотров

Так решилась моя проблема.
Вообщем ситуация такая, нужно для получения code заходить по http, а не по https.

Пригласить эксперта

Почему не испольуете Auth Widget?

// EDIT

Если проблемы в серверной части:
1) проверьте настройки приложения ВК (callback url итд)
2) проверьте ссылки, которые генерируете


  • Показать ещё
    Загружается…

24 июн. 2023, в 14:19

200 руб./за проект

24 июн. 2023, в 14:07

1000 руб./за проект

24 июн. 2023, в 12:53

25000 руб./за проект

Минуточку внимания

При самой первой авторизации на сайте получаю такую ошибку, но при этом авторизация выполняется у пользователя:
TokenError: Code is invalid or expired. at Strategy.OAuth2Strategy.parseErrorResponse (/srv/13case/node_modules/passport-oauth2/lib/strategy.js:320:12) at Strategy.parseErrorResponse (/srv/13case/node_modules/passport-vkontakte/lib/passport-vkontakte/strategy.js:176:54) at Strategy.OAuth2Strategy._createOAuthError (/srv/13case/node_modules/passport-oauth2/lib/strategy.js:367:16) at /srv/13case/node_modules/passport-oauth2/lib/strategy.js:166:45 at /srv/13case/node_modules/oauth/lib/oauth2.js:191:18 at passBackControl (/srv/13case/node_modules/oauth/lib/oauth2.js:132:9) at IncomingMessage.<anonymous> (/srv/13case/node_modules/oauth/lib/oauth2.js:157:7) at emitNone (events.js:91:20) at IncomingMessage.emit (events.js:185:7) at endReadableNT (_stream_readable.js:974:12)

Код обработчика:
passport.use(new VkStrategy( { clientID: config.get('vkID'), clientSecret: config.get('vkSecret'), callbackURL: config.get('vkCb') + '/auth/vk/callback' }, function verify(accessToken, refreshToken, params, profile, done) { process.nextTick(function () { return done(null, { userid: profile.id, username: profile.displayName, photoUrl: profile.photos[0].value, profileUrl: profile.profileUrl }); }); } ));

Код роутерингов:
app.get('/auth/vk', passport.authenticate('vkontakte'), function(req, res){}); app.get('/auth/vk/undefined', passport.authenticate('vkontakte'), function(req, res){}); app.get('/auth/vk/callback', passport.authenticate('vkontakte', { failureRedirect: '/' }), function(req, res) { res.redirect(req.headers.referer); });

В чем проблема?

  • Ошибка nw 34922 0
  • Ошибка nw 31374 8 на ps4
  • Ошибка nw 31314 2 ps4
  • Ошибка nw 31297 2 на сони пс4
  • Ошибка nw 31297 2 на ps4 что делать