0

我正嘗試使用Google Classroom API和服務帳戶創建Google課堂課程。我目前正在嘗試使用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]serviceaccount.com", 
     "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.我得到這段代碼的安全含義。它只在一個安全的環境中進行實驗。它不會看到白天的光芒。

回答