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.我得到这段代码的安全含义。它只在一个安全的环境中进行实验。它不会看到白天的光芒。

回答