angularjs Google认证/Gapi:未捕获的类型错误:无法读取null的属性“postMessage”

mkh04yzy  于 2023-03-28  发布在  Angular
关注(0)|答案(1)|浏览(160)
  • 大家好 *

我正在使用Angular.js1.5Google Authentication(gapi)UI router创建一个Web应用程序。
我的主要目标是首先初始化GoogleUser,使用主抽象状态的resolve方法

$stateProvider
    .state('app', {
      url:'/',
      templateUrl: 'layout/app-view.html',
      resolve: {
        googleAuth: function (User:UserService) {
          return User.initCurrent();
        }
      }
    });

在这一点上,它工作得很好-它注入了UserService,并调用其initCurrent()方法,该方法返回一个promise,一旦当前用户初始化,该方法将是完整的。下面是UserService简洁代码

class UserService implements UserInterface {
  public current:GoogleUser;
  private _GoogleAuth:GoogleAuthService;
  private _AppConstants;

  constructor(GoogleAuth:GoogleAuthService) {
    'ngInject';
    this._GoogleAuth = GoogleAuth;
  }

  initCurrent():ng.IPromise<GoogleUser> {
    return this._GoogleAuth.getCurrentUser().then((current) => {
      this.current = current;
      return this.current;
    })
  }
}

反过来initCurrent()getCurrentUser()接收一个promise,这个promise将在gapi加载和GoogleAuth示例初始化后实现。为此我创建了一个GoogleAuthService

class GoogleAuthService implements GoogleAuthServiceInterface {
  public googleAuth;
  private _AppConstants;
  private deferGoogleAuthInit:ng.IDeferred<any>;

  constructor(AppConstants, $log, $q:ng.IQService) {
    'ngInject';
    this._AppConstants = AppConstants;
    this.deferGoogleAuthInit = $q.defer();
    gapi.load('auth2', () => {
      gapi.auth2.init({
        client_id: AppConstants.googleClientId,
        cookiepolicy: 'single_host_origin'
      }).then((googleAuth) => {
        this.googleAuth = googleAuth;
        this.deferGoogleAuthInit.resolve('GoogleAuth Initialized');
      })
    });
  }
  getCurrentUser() {
    return this.deferGoogleAuthInit
      .promise.then(() => {
        return this.googleAuth.currentUser.get()
      })
  }
}

**问题:**当我不使用resolve方法初始化用户,并通过控制台做同样的事情:获取UserService示例、initCurrentUser等,一切正常:signIn/signOut,获取当前用户等。但当我在resolve方法中初始化当前用户时,尝试signOut会导致以下错误消息:

未捕获的类型错误:无法读取null的属性“postMessage”
但在同一时间,所有的服务注入正确,我收到了一个正确的用户示例,虽然我不能重新登录它.你会有什么建议?

w1jd8yoj

w1jd8yoj1#

我在react应用程序上遇到了类似的问题。我能够通过更改CORS策略来解决,如下所示:

Cross-Origin-Opener-Policy: same-origin-allow-popups

救世主参考-
https://github.com/google/google-api-javascript-client/issues/796#issuecomment-1118136612
(从-Why Google-Auth(Google Identity) Blank popup in Django?中找到)

相关问题