在 Cordova/Phonegap 中使用 Google API javascript

Using the Google API javascript in Cordova / Phonegap

我正在使用 Cordova 开发应用程序并想将文件保存在 Googe Drive 中。

我使用 cordova-plugin-googleplus (https://github.com/EddyVerbruggen/cordova-plugin-googleplus) 成功登录 Google。但是我无法获得插件 returns 给我 accessToken 或 idToken 所以我可以使用 Google javascript API.

window.plugins.googleplus.login(
    {
        'scopes': 'https://www.googleapis.com/auth/drive.file profile',
        'offline': true, 
        'webApiKey': ‘CODE’ 
    },
    function (obj) {
        $scope.$apply(function() {
            $scope.srcImage = obj.imageUrl;
            $scope.NomeGoogle = obj.displayName;
        });
    },
    function (msg) {
        alert('Erro');
        alert('error: ' + msg);
    }
);

我尝试使用下面的代码,但返回了以下错误:

"Uncaught gapi.auth2.ExternallyVisibleError: Invalid cookiePolicy"

gapi.load('auth2', function() {

    gapi.auth2.init({

        client_id: 'REVERSED_CLIENTID',

    }).then(function(){

        auth2 = gapi.auth2.getAuthInstance();
        console.log(auth2.isSignedIn.get()); //now this always returns correctly        

    });
});

尝试

    window.plugins.googleplus.login(
        {
            'scopes': 'https://www.googleapis.com/auth/drive.file profile',
            'offline': true, 
            'cookiepolicy': 'none',
            'webApiKey': ‘CODE’ 
        }

我设法找出问题所在,为什么没有从插件中获取 serverAuthCode。 有必要在 Google 开发人员控制台上创建 2 个凭据。第一个必须是 Android,这将用于插件,第二个应该是 Web 应用程序,这是实现 serverAuthCode 所必需的。

代码如下所示

window.plugins.googleplus.login(
    {
        'scopes': 'https://www.googleapis.com/auth/drive.file profile',
        'offline': true, 
        'webApiKey': ‘REVERSED_CODE of Web App Credential’ 
    },
    function (obj) {
        $scope.$apply(function() {
            $scope.srcImage = obj.imageUrl;
            $scope.NomeGoogle = obj.displayName;
        });


            var data = $.param({
                client_id: 'REVERSED_CODE of Web App Credential',
                client_secret: 'SECRET_CODE of Web App Credential',
                grant_type: 'authorization_code',
                code: obj.serverAuthCode
            });

            var config = {
                headers : {
                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                }
            }

            $http.post("https://www.googleapis.com/oauth2/v3/token", data, config).success(function(data, status) {
                //data.access_token;

/** from now you can do use of google API **/

            })
            .error(function(data, status) {
                console.log(data);
                console.log(status);
            });

    },
    function (msg) {
        alert('Erro');
        alert('error: ' + msg);
    }
);

感谢您的回复 rojobo

起初我希望跳过对 cordova-plugin-googleplus 的需求,只使用 Cordova/PhoneGap 中的 gapi 来处理 Google 的身份验证,但它出现 gapi client authentication may not work within cordova's file:// protocol.

向我发送了正确的方向,但是在检索 access_token 后尝试使用 gapi 时,我一直收到 Invalid cookiePolicy 错误(这是因为我忽略了下面列出的第 2 步,并且在使用 plugini 进行身份验证后,我错误地尝试使用 gapi).

再次 进行身份验证

有一个步骤(下面提到的#3)我不清楚。要使用 Google 进行身份验证,然后使用 Cordova/PhoneGap 中的 gapi,这会起作用...

  1. 使用 cordova-plugin-googleplus 来处理身份验证和访问令牌检索,这里根本不要使用 gapi
  2. 加载 gapi 客户端库(跳过 gapi.client.init() 调用和所有正常的 gapi 身份验证过程)
  3. 将我们从插件获得的访问令牌附加到 gapi 客户端,然后根据需要进行 gapi 调用

第 3 步用了 some digging for me to find,这意味着我需要添加 access_token

gapi.client.setToken({access_token:'abc123456xyz'});

将访问令牌附加到 gapi 客户端后,我可以在 Cordova/Phonegap:

中使用 gapi
// Load the YouTube API.
gapi.client.load('youtube', 'v3', function() {
  // Do stuff...
};