Javascript 谷歌+;CreateActivity returning";401“未经授权”;因为某些原因

Javascript 谷歌+;CreateActivity returning";401“未经授权”;因为某些原因,javascript,google-api,google-plus,google-authentication,google-api-js-client,Javascript,Google Api,Google Plus,Google Authentication,Google Api Js Client,我有一个Google+应用程序正在为某些测试帐户成功编写应用程序活动,但其他应用程序返回401未经授权的错误: { "error": { "errors": [ { "domain": "global", "reason": "unauthorized", "message": "Unauthorized" } ], "code": 401, "message": "Unauthorized" } } 我在回复标题中也注意到了这一点: W

我有一个Google+应用程序正在为某些测试帐户成功编写应用程序活动,但其他应用程序返回401未经授权的错误:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "unauthorized",
    "message": "Unauthorized"
   }
  ],
  "code": 401,
  "message": "Unauthorized"
 }
}
我在回复标题中也注意到了这一点:

WWW-AuthenticateBearer realm="https://www.google.com/accounts/AuthSubRequest", error=invalid_token
这似乎表明令牌无效,但我不确定如何错误地使用gapi.auth.authorize。。。特别是因为脚本使用某些测试帐户可以完美地工作,并且可以毫无问题地将时刻写入G+。如果有人可以提出某些测试帐户无法验证编写应用程序活动的原因(或下面的代码有任何错误),请让我知道

// first call gapi.auth.authorize with immediate:true:
 _checkAuth = function _checkAuth(){
        gapi.auth.authorize({
            client_id : 'XXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com',
            scope : 'https://www.googleapis.com/auth/plus.login',
            request_visible_actions : 'http://schemas.google.com/CreateActivity',
            immediate : true
        }, function(authResult){
            if(!authResult || authResult.error){
               _signIn();
            }else{
                _performAction();
            }
        });
    },

// if not logged in, call gapi.auth.authorize with immediate:false:
_signIn = function _signIn(){
        gapi.auth.authorize({
            client_id : 'XXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com',
            scope : 'https://www.googleapis.com/auth/plus.login',
            request_visible_actions : 'http://schemas.google.com/CreateActivity',
            immediate : false
        }, function(token){
            gapi.auth.setToken(token);
           _performAction();
        });
    },

// create activity
_performAction = function _performAction(){
        gapi.client.load('plus','v1', function(){
            gapi.client.setApiKey('XXXXXXXXXXXXXXXXXXXXXXX');
            var payload = {
                "type" : 'http://schemas.google.com/CreateActivity'
            };
            payload.target = {
                "id" : "myappid",
                "image" : "http://www.example.com/xxxxxxxxxxx.jpg",
                "type" : 'http://schema.org/CreativeWork',
                "description" : "description of activity",
                "name" : "name of activity"
            };
            var args = {
                'path' : '/plus/v1/people/me/moments/vault',
                'method' : 'POST',
                'body' : JSON.stringify(payload),
                'callback' : function(response) {
                    console.log(response); // error
                }
            };
            // triggers 401 error for some accounts
            gapi.client.request(args);
        });
},

关于原因的两个想法:

  • 是否有一些帐户升级到Google+而其他帐户没有?这可能是Google+方面的一个bug,但如果帐户尚未升级,连接应用程序等概念可能会被解释为一个错误
  • 是否有可能您正在尝试编写不同类型的应用程序活动,或者这是唯一的代码编写应用程序活动
  • 您正在存储访问令牌吗?这些将在3600秒后过期。你可以
  • 为什么要调用gapi.client.setApiKey?当编写应用程序活动需要授权凭据时,这应用于未经验证的API调用。客户端库将使用用户授权应用程序后捕获的凭据
  • 为什么不使用Google+API客户端库?我将给出一个使用客户端库编写应用程序活动的示例,希望这会有所帮助
请求对演示中使用的应用程序活动进行写入访问的示例按钮:

<button class="g-signin"
    data-scope="https://www.googleapis.com/auth/plus.login"
    data-requestvisibleactions=
    "http://schemas.google.com/AddActivity http://schemas.google.com/ListenActivity"
    data-clientId="268858962829.apps.googleusercontent.com"
    data-callback="onSignInCallback"
    data-theme="dark"
    data-cookiepolicy="single_host_origin">
</button>
工作地点:


非常感谢您的回复。您的演示与我遇到问题的测试帐户配合使用,它编写应用程序活动时没有任何问题。。。然而,接下来我将其源代码复制到我的环境中,并更改了客户机id和有效负载目标id,并且再次得到401错误。我在开发人员控制台中查看,似乎所有内容都设置正确(Javascript源代码,等等),但我想知道是否有一个设置需要在某个地方进行调整。您在请求中使用的所有操作都是可见的吗?我在回答中给出了一个示例按钮-您将知道您的设置是正确的,因为“活动类型”将显示在“同意”对话框中。@class您用什么重新保存“ReplaceWithUniquedForAddTarget”。你从哪里得到这些信息?
    writeAddActivity: function(url){
      var payload = {
        "type":"http:\/\/schemas.google.com\/AddActivity",
        "startDate": "2012-10-31T23:59:59.999Z"
      };
      if (url != undefined){
        payload.target = {
          'url' : 'https://developers.google.com/+/plugins/snippet/examples/thing'
        };
      }else{
        payload.target = {
          "id" : "replacewithuniqueidforaddtarget",
          "image" : "http:\/\/www.google.com\/s2\/static\/images\/GoogleyEyes.png",
          "type" : "http:\/\/schema.org\/CreativeWork",
          "description" : "The description for the activity",
          "name":"An example of AddActivity"
        };
      }
      this.writeAppActivity(payload);
    },
    writeAppActivity: function(payload){

      gapi.client.plus.moments.insert(
          {  'userId' : 'me',
             'collection' : 'vault',
             'resource' : payload
          }).execute(function(result){
              console.log(result);
          });
    }