0

내가 성공적으로 특정 테스트 계정의 앱 활동을 기록하는 Google+ 앱이 아직 다른 사람은 401 권한 오류를 반환하기위한 "401 권한"Google+에 CreateActivity 반환 특정 계정

{ 
"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 및 payload 대상 ID를 변경하고 다시 한 번 401 오류가 발생했습니다. 개발자 콘솔을보고 있는데 모든 것이 올바르게 설정되어있는 것 같습니다 (자바 스크립트 기반 등). 어딘가에 조정해야하는 설정이 있는지 궁금합니다. –

+0

사용중인 모든 작업이 request_visible_actions에 설정되어 있습니까? 응답에서 예제 단추를 제공 했으므로 동의 유형 대화 상자에 활동 유형이 표시되므로 제대로 설정했음을 알 수 있습니다. – class

+0

@class "replacewithuniqueid for addtarget"을 (를) 다시 작성 하시겠습니까? 이 정보는 어디에서 얻습니까? – Supertecnoboff