如何解决Google Classroom API更新学生成绩时的ProjectPermissionDenied错误
Google Classroom API更新成绩403 ProjectPermissionDenied错误解决方法
你遇到的两次报错都是同一个权限问题,按照以下步骤逐一排查即可解决:
- 检查OAuth授权范围
修改学生成绩必须申请https://www.googleapis.com/auth/classroom.coursework.students权限范围,确认你getClient()方法中配置的scopes包含该范围,不要仅使用只读类的Classroom权限。如果之前授权过旧的权限范围,需要删除本地存储的token文件,重新发起OAuth授权获取对应权限的令牌。 - 确认操作账号的角色权限
发起授权的Google账号必须是对应课程的授课教师,或者是教育域的管理员,学生账号没有修改成绩的权限。同时要确认该账号对要修改的作业有成绩管理权限,非作业创建者的协作者需要教师额外分配成绩编辑权限。 - 核对Google Cloud项目配置
确认你使用的OAuth凭据对应的Google Cloud项目已经启用了Classroom API,没有被禁用。如果你使用的是教育机构的域名账号,需要联系域管理员确认没有限制第三方应用访问Classroom数据。 - 确认updateMask配置正确
你代码中的updateMask字段配置assignedGrade,draftGrade是正确的,无需修改,但要注意不要在字段中间加空格或者拼写错误,格式错误也可能触发权限类报错。
以下是正确的PHP客户端初始化示例,你可以对比调整你的getClient()方法:
function getClient() { $client = new Google_Client(); $client->setApplicationName('Classroom成绩更新工具'); // 必须配置该scope才能修改成绩 $client->setScopes('https://www.googleapis.com/auth/classroom.coursework.students'); $client->setAuthConfig('你的凭据文件路径.json'); $client->setAccessType('offline'); $client->setPrompt('select_account consent'); $tokenPath = 'token存储路径.json'; if (file_exists($tokenPath)) { $accessToken = json_decode(file_get_contents($tokenPath), true); $client->setAccessToken($accessToken); } if ($client->isAccessTokenExpired()) { if ($client->getRefreshToken()) { $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); } else { $authUrl = $client->createAuthUrl(); print "请访问以下链接完成授权: \n$authUrl\n"; print "输入授权码: "; $authCode = trim(fgets(STDIN)); $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); $client->setAccessToken($accessToken); if (array_key_exists('error', $accessToken)) { throw new Exception(implode(', ', $accessToken)); } file_put_contents($tokenPath, json_encode($client->getAccessToken())); } } return $client; }
内容的提问来源于stack exchange,提问作者Mahmud Hosen
相关产品推荐
相关产品推荐

