如何在Javascript API中获取Google refresh_token?

时间:2015-03-23 10:23:47

标签: javascript cordova oauth gmail ngcordova

我正在建立一个人们可以通过身份验证来阅读他们的Gmail的系统。我在Python上使用OAuth2在我的网站上运行得非常好;在谷歌的回复中,我得到access_tokentoken_typeexpires_in和(最重要的)refresh_token

我现在希望在Javascript中使用相同的工具(对于我使用Ionic构建的应用程序)。所以我使用ngCordovaOauth使用以下代码进行身份验证:

$cordovaOauth.google(
    'xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
    ['https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/gmail.readonly'],
    {
        'access_type': 'offline',
        'approval_prompt': 'force'
    }
)
    .then(function(result){
        console.log("Response object -> " + JSON.stringify(result));
    }, function(error){
        console.log('Error -> ' + error);
    });

正如预期的那样,这会在我的手机上生成以下屏幕:

enter image description here

但是在json我回来的时候没有refresh_token

{"access_token":"xxxx.xxxxxxxxxxxx","token_type":"Bearer","expires_in":"3599"}

有人知道为什么我在使用Javascript api时没有获得refesh_token?欢迎所有提示!

2 个答案:

答案 0 :(得分:0)

CordovaOauth正在使用OAuth 2.0的Implicit grant type,该规范适用于“使用JavaScript等脚本语言在浏览器中实现的客户端”。通过此流程,客户端将直接发出一个访问令牌,并且只有那个。

Authorization Code grant type中,客户端会获得一个授权代码,然后它会为Access和Refresh Tokens进行交换,但这也包括客户端本身的身份验证,这就是为什么它在Server-to中完成的原因。 - 服务器方式。您不希望在面向最终用户的JavaScript代码中公开您的client_id / client_secret。

请同时查看解释不同情况的Google Documentation

答案 1 :(得分:0)

为什么您不能使用Cordova / Ionic / Angular请求刷新令牌? ...

我有一个获取刷新令牌,访问令牌等的应用程序。因此我使用了这段代码:

apiKey                  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
clientID                = 'xxxxxxxxxxxxxxxxxxxxxxxxxx2ivu3.apps.googleusercontent.com';
var notiID              = 0;
var googleapi           = {

authorize:  function(options) {
                var deferred = $.Deferred();
                var authUrl = 'https://accounts.google.com/o/oauth2/auth?' + $.param({
                    client_id: options.client_id,
                    redirect_uri: options.redirect_uri,
                    response_type: 'code',
                    scope: options.scope
                });

                var authWindow = window.open(authUrl, '_blank', 'location=yes');
                $(authWindow).on('loadstart', function(e) {
                    var url = e.originalEvent.url;
                    var code = /\?code=(.+)$/.exec(url);
                    var error = /\?error=(.+)$/.exec(url);

                    if (code || error) {
                        //Always close the browser when match is found
                        authWindow.close();
                        loadingSpinner();
                    }

                    if (code) {
                        $.post('https://accounts.google.com/o/oauth2/token', {
                            code: code[1],
                            client_id: options.client_id,
                            client_secret: options.client_secret,
                            redirect_uri: options.redirect_uri,
                            grant_type: 'authorization_code'
                        }).done(function(data) {
                            deferred.resolve(data);

                            $("#loginStatus").html('Name: ' + data.given_name);
                        }).fail(function(response) {
                            deferred.reject(response.responseJSON);
                        });
                    } else if (error) {
                        deferred.reject({
                            error: error[1]
                        });
                    }
                });

                return deferred.promise();
            }
        };

这个用于请求访问和刷新令牌:

function callGoogle()
{

//  alert('starting');
    googleapi.authorize({
                        client_id: clientID,
                        client_secret: apiKey,
                        redirect_uri: 'http://localhost',
                        scope: 'https://www.googleapis.com/auth/analytics.readonly'
                        }).done(function(data) {
                                localStorage.accessToken=data.access_token;
                                localStorage.refreshToken=data.refresh_token;
                                // console.log(JSON.stringify(data));
                                // console.log(localStorage.accessToken);
                                // console.log(localStorage.refreshToken);
                                getDataProfile();


                                });

}

尝试一下,让我知道,你需要进一步的帮助。您只需要inappbrowser和console插件。当然还有jQuery。