0

Я пытаюсь создать курс Google Classroom, используя API Google Classroom и учетную запись службы. В настоящее время я экспериментирую с использованием JavaScript, и у меня есть все, что создано и работает, чтобы получить список, конечно. Я настроил JWT и запросил токен аутентификации, который я получаю.Ошибка Google Classroom API 401

{"access_token":"----ACCESS TOKEN HERE----------","token_type":"Bearer","expires_in":3600} 

Когда я использую это, чтобы получить список курсов пользователя (через GET), проблем нет. Я получаю правильный ответ со списком курсов, которые затем показываю в таблице.

Когда я пытаюсь использовать тот же самый процесс, чтобы попытаться создать курс (через POST), я получаю 401 ошибку:

{ 
    "error": { 
    "code": 401, 
    "message": "The request does not have valid authentication credentials.", 
    "status": "UNAUTHENTICATED" 
    } 
} 

Это код, который я использую для проверки подлинности:

function authenticate(callback) { 
    function b64EncodeUnicode(str) { 
     str = JSON.stringify(str); 
     return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) { 
      return String.fromCharCode('0x' + p1); 
      })); 
     }   


    // constuct the JWT 
    var jwtHeader = { 
     "alg":"RS256", 
     "typ":"JWT" 
    } 
    jwtHeader = JSON.stringify(jwtHeader); 

    //construct the Claim 
    var jwtClaim = { 
     "iss":"[email protected]", 
     "scope":"https://www.googleapis.com/auth/classroom.courses https://www.googleapis.com/auth/classroom.rosters", 
     "sub":"[email protected]", //this is an admin account I shouldn't really need this but tried with and without it 
     "aud":"https://www.googleapis.com/oauth2/v4/token", 
     "exp":(Math.round(new Date().getTime()/1000) + 60 * 10), 
     "iat":Math.round(new Date().getTime()/1000) 
    } 
    jwtClaim = JSON.stringify(jwtClaim); 

    //construct the signature 
    var key="-----BEGIN PRIVATE KEY-----Removed-----END PRIVATE KEY-----\n"; 
    var jwtSign = b64EncodeUnicode(jwtSign); 
    var sJWT = KJUR.jws.JWS.sign("RS256", jwtHeader, jwtClaim, key); 

    var jwt = jwtHeader + "." + jwtClaim + "." + sJWT; 

    //request Token 
    var grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer"; 
    var tokenRequest = "grant_type=" + grantType + "&assertion=" + sJWT; 
    var postURL = "https://www.googleapis.com/oauth2/v4/token" 
    request = $j.ajax({ 
     url: postURL, 
     type: "post", 
     data: tokenRequest, 
     success: callback 
    }); 
} 

Это код, который я использую для получения списка курсов. (это работает)

$j("#getClasses").click(function(event){ 
    function getClasses(callback){ 
     authenticate(function(data){ 
      console.log(JSON.stringify(data)); 
      var access_token = data["access_token"]; 
      var apiUrl = 'https://classroom.googleapis.com/v1/courses' 
      var myData = 'teacherId=~(teacheremail)&access_token='+access_token; 

      var files = $j.ajax({ 
       url: apiUrl, 
       type: "get", 
       data: myData, 
       success: function (data) { 
        var retreivedClasses = JSON.stringify(data); 
        for(var i = 0; i < data['courses'].length; i++){ 
         nextObject = data['courses']; 
         $j('#classListTable').append('<tr><td>' + nextObject[i]['name'] + '</td><td>' + nextObject[i]['courseState'] + '</td><td>' + nextObject[i]['enrollmentCode'] + '</td></tr>'); 
        } 
        //$j('#classList').text(retreivedClasses); 
       } 
      }); 
     }); 
    } 
getClasses(); 
}); 

Это код, который я использую для создания курса через POST. Я жестко закодировал несколько переменных для тестирования, но все же дает ошибку 401.

$j("#createClass").click(function(event){ 
    function createClass(callback){ 
     authenticate(function(data){ 
      console.log(JSON.stringify(data)); 
      var access_token = data["access_token"]; 
      var tokenInfo = $j.ajax({ 
       url: 'https://www.googleapis.com/oauth2/v3/tokeninfo', 
       type: 'get', 
       data: "access_token="+access_token 
      }); 
      var apiUrl = 'https://classroom.googleapis.com/v1/courses' 
      var myData = 'access_token='+access_token + '&[email protected]&name=myClass' 

      console.log(myData); 
      var newGoogleClassroom = $j.ajax({ 
       url: apiUrl, 
       type: "post", 
       data: myData, 
       success: function (data) { 
        var apiResponse = JSON.stringify(data); 
        $j('#classCreated').text(apiResponse); 
        } 
      }); 
     }); 
    }; 
createClass(); 
}); 

И наконец, это то, что я получаю, когда получаю информацию о токенах. Он выглядит хорошо для меня, т.е. собственно прицелы: (но я новичок в этом)

{ 
"azp": "removed", 
"aud": "removed", 
"scope": "https://www.googleapis.com/auth/classroom.courses https://www.googleapis.com/auth/classroom 
.rosters", 
"exp": "1474512198", 
"expires_in": "3600", 
"access_type": "offline" 
} 

Я был бы признателен за любую помощь. Doug

P.S. Я получаю последствия этого кода для безопасности. Он находится в безопасной среде только для экспериментов. Он не увидит свет дня.

ответ

0

Основываясь на этом forum, который также принимает ошибку 401, попробуйте отозвать старый oauth. Как указано в этом related thread, 401 Несанкционированная ошибка, которую вы испытали, может быть связана с OAuth 2.0 Authorization с использованием OAuth 2.0 client ID.

Suggested action: Обновите токен доступа, используя токен обновленного обновления. Если это не удается, пройдите через поток OAuth.