使用Google API将变量从AngularJS服务传递到控制器?

zbdgwd5y  于 2022-10-31  发布在  Angular
关注(0)|答案(2)|浏览(135)

我正在尝试使用Google API Javascript客户端在我的应用程序上使用Google Login,然后访问用户的电子邮件地址和联系人。我将其与AngularJS结合起来,我已经了解到最好将其作为自己的服务。
下面是目前为止服务的代码:

.service('googleLogin', ['$http', '$rootScope', function ($http, $rootScope) {
            var clientId = '{MY CLIENT KEY}',
                apiKey = '{MY API KEY}',
                scopes = 'https://www.googleapis.com/auth/userinfo.email https://www.google.com/m8/feeds',
                domain = '{MY COMPANY DOMAIN}';

            this.handleClientLoad = function () {
                // Step 2: Reference the API key
                gapi.client.setApiKey(apiKey);
                gapi.auth.init(function () { });
                window.setTimeout(checkAuth, 1);
            };

            this.checkAuth = function() {
                gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: true, hd: domain }, this.handleAuthResult );
            };

            this.handleAuthResult = function(authResult) {
                if (authResult && !authResult.error) {
                    gapi.client.load('oauth2', 'v2', function () {
                        var request = gapi.client.oauth2.userinfo.get();
                        request.execute(function (resp) {
                            console.log(userEmail);
                        });
                    });
                }
            };

            this.handleAuthClick = function (event) {
                // Step 3: get authorization to use private data
                gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: false, hd: domain }, this.handleAuthResult );
                return false;
            };

        }]);

然后我从控制器调用它,如下所示:

$scope.login = function () {
            googleLogin.handleAuthClick();
        };

这样可以正常工作,并且API被正确调用。但是现在,我不确定如何通过服务从API获取数据。我需要获取用户的电子邮件地址,以及他们的联系人列表。我不能只使用单独的get函数来返回这些值,因为似乎API客户端调用必须在链中进行(例如,handleAuthResult作为handleAuthClick中的参数调用)。
我也尝试过将它们设置为$rootScope值,或者只是普通变量,但是一旦控制器调用它们,它们总是以undefined的形式出现。
我的方法正确吗?我如何从Google API中获取这些变量,然后将其发送到服务器和控制器?谢谢。

lyr7nygr

lyr7nygr1#

我最终使用了angularJS中的promise/defer实现,文档为here
以下是最后一项服务:

.service('googleLogin', ['$http', '$rootScope', '$q', function ($http, $rootScope, $q) {
            var clientId = '{MY CLIENT ID}',
                apiKey = '{MY API KEY}',
                scopes = 'https://www.googleapis.com/auth/userinfo.email https://www.google.com/m8/feeds',
                domain = '{MY COMPANY DOMAIN}',
                userEmail,
                deferred = $q.defer();

            this.login = function () {
                gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: false, hd: domain }, this.handleAuthResult);

                return deferred.promise;
            }

            this.handleClientLoad = function () {
                gapi.client.setApiKey(apiKey);
                gapi.auth.init(function () { });
                window.setTimeout(checkAuth, 1);
            };

            this.checkAuth = function() {
                gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: true, hd: domain }, this.handleAuthResult );
            };

            this.handleAuthResult = function(authResult) {
                if (authResult && !authResult.error) {
                    var data = {};
                    gapi.client.load('oauth2', 'v2', function () {
                        var request = gapi.client.oauth2.userinfo.get();
                        request.execute(function (resp) {
                            $rootScope.$apply(function () {
                                data.email = resp.email;
                            });
                        });
                    });
                    deferred.resolve(data);
                } else {
                    deferred.reject('error');
                }
            };

            this.handleAuthClick = function (event) {
                gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: false, hd: domain }, this.handleAuthResult );
                return false;
            };

        }]);

以及它目前在控制器中的调用方式:

var promise = googleLogin.login();
                promise.then(function (data) {
                    console.log(data.email);
                }, function (reason) {
                    console.log('Failed: ' + reason);
                });
e5nqia27

e5nqia272#

使用以下方式:
如果您的应用程序是一个应用程序,那么您可以使用这个方法来验证您的应用程序。System.out.println(“已加载应用程序默认凭据。”);返回凭据;} catch(IOException e){ //不需要执行任何操作,我们将返回到其他凭据。}

相关问题