2015-03-15 3 views
1

Я пытаюсь authentiate через OAuth Google, но у меня возникают проблемы, устанавливающих связь с их APIinvalid_grant Google OAuth

Мой код клиента:

'click #addChannel': function (event) { 
    event.preventDefault(); 

    var userId = Meteor.userId(); 
    var options = { 
     requestPermissions: [ 
     'https://www.googleapis.com/auth/youtube', 
     'https://www.googleapis.com/auth/userinfo.email', 
     'https://www.googleapis.com/auth/youtube.force-ssl', 
     'https://www.googleapis.com/auth/youtube.readonly', 
     'https://www.googleapis.com/auth/youtube.upload', 
     'https://www.googleapis.com/auth/youtubepartner', 
     'https://www.googleapis.com/auth/youtubepartner-channel-audit', 
     ], 
     requestOfflineToken: true 
    }; 

    Google.requestCredential(options, function(token) { 
     Meteor.call('userAddOauthCredentials', userId, token, function(error, result) { 
     if (error) { 
      throw error; 
     } 
     console.log(result); 
     }); 

    }); 

Мой код сервера:

userAddOauthCredentials: function(userId, token) { 
    check(userId, String); 
    check(token, String); 

    var config = ServiceConfiguration.configurations.findOne({service: 'google'}); 
    if (!config) { 
     throw new ServiceConfiguration.ConfigError(); 
    } 

    console.log(token, config); 

    var endpoint = 'https://accounts.google.com/o/oauth2/token'; 
    var params = { 
     code: token, 
     client_id: config.clientId, 
     client_secret: OAuth.openSecret(config.secret), 
     redirect_uri: OAuth._redirectUri('google', config), 
     grant_type: 'authorization_code', 
    }; 

    try { <------------------------------------------------------ this fails 
     response = HTTP.post(endpoint, { params: params }); 
    } catch (err) { 
     throw _.extend(new Error("(first) Failed to complete OAuth handshake with Google. " + err.message), 
        {response: err.response}); 
    } 

    if (response.data.error) { // if the http response was a json object with an error attribute 
     throw new Error("(second) Failed to complete OAuth handshake with Google. " + response.data); 
    } else { 
     return { 
     accessToken: response.data.access_token, 
     refreshToken: response.data.refresh_token, 
     expiresIn: response.data.expires_in, 
     idToken: response.data.id_token 
     }; 
    } 

Приведенная выше ошибка [400] { "error" : "invalid_grant" }.

Большая часть приведенного выше кода я получил от того, как учетные записи метеоров - пакеты google регистрируются пользователем (что отлично работает в моем приложении). Ссылка на что:

https://github.com/meteor/meteor/blob/87e3c6499d5eacce62f10faefe9ce49c77bb03ee/packages/google/google_server.js

Любые советы о том, как действовать дальше?

Высокую оценку

Update1:

я получаю эти предупреждения в моем журнале

W20150318-09:11:42.532(1) (oauth_server.js:71) Unable to base64 decode state from OAuth query: undefined 
W20150318-09:11:42.532(1) (oauth_server.js:71) Unable to base64 decode state from OAuth query: undefined 
W20150318-09:11:42.533(1) (oauth_server.js:71) Unable to base64 decode state from OAuth query: undefined 
W20150318-09:11:42.534(1) (oauth_server.js:398) Error in OAuth Server: Match error: Expected string, got undefined 
+0

Просто убедитесь, что вы создали свой собственный clientID и clientSecret, правильно? 400, как правило, вызваны неправильными параметрами запроса, поэтому я предлагаю попытаться проследить, какой метод вызывает ошибку, и убедиться, что он вызван правильно. – Andy

+0

Да, я их создал. Кроме того, это не мое приложение, которое генерирует ошибку, но оно возвращается из API google – Tarlen

+0

Есть ли у вас какие-либо сетевые следы запросов к google OAuth? Кроме того, вы получаете код авторизации от своего клиента и видите ошибку во время обмена кодами? – class

ответ

0

Вы должны разобрать ваш вар PARAMS в применение/х-WWW-форм-urlencoded. Пожалуйста, найдите ниже код для синтаксического анализа, как я сделал в PHP

$fields_string=""; 
    foreach($params as $key=>$value) 
    { 
     $fields_string .= $key.'='.$value.'&'; 
    } 
    rtrim($fields_string, '&'); 

Теперь $ filed_string будет содержится разбор Params массива.

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