0

我有一個Google+應用是成功編寫的應用程序的活動對於某些測試帳戶,還有一些返回一個401未經授權錯誤:Google+的CreateActivity返回「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); 
     }); 
}, 

回答

1

的原因,一對夫婦的想法:

  • 都是一些升級至Google+帳戶和其他人沒有的?這可能是Google+方面的一個錯誤,但如果帳戶尚未升級,連接應用程序等概念可能會被解釋爲錯誤。
  • 您可能試圖編寫不同類型的應用程序活動,或者這是編寫應用程序活動的唯一代碼嗎?
  • 您是否存儲訪問令牌?這些在3600秒後過期。你可以verify your tokens here
  • 你爲什麼打電話給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> 

使用客戶端庫編寫應用程序的活動的一個例子。

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); 
      }); 
    } 

在工作演示:

http://wheresgus.com/appactivitiesdemo/

+0

非常感謝您的回覆。你的演示與我遇到的測試帳戶一起工作,它沒有任何問題寫入應用程序活動......但是,接下來我將源代碼複製到我的環境中,並更改了client_id和有效內容目標ID,並且再次得到401錯誤。我正在開發人員控制檯中查看,並且所有內容似乎都已正確設置(Javascript起源等),但我想知道是否需要調整某個設置。 –

+0

您正在使用的所有操作都設置在request_visible_actions中?我在答案中給出了一個示例按鈕 - 您將知道您正確設置了它們,因爲活動類型將出現在同意對話框中。 – class

+0

@class什麼是你用「替換」來替換「replacewithuniqueidforaddtarget」。你從哪裏得到這些信息? – Supertecnoboff