【问题标题】:Google Classroom Apps Script - CourseWork.list permission errorGoogle Classroom Apps 脚本 - CourseWork.list 权限错误
【发布时间】:2017-08-05 10:00:21
【问题描述】:

我正在尝试使用 Classroom API v1 以 Google Apps 脚本从我的 Google Classroom 访问课程作业。我按照快速入门中的步骤成功检索了我的课程列表,但是当我尝试使用以下方法访问我的一个课程中的课程时:

var coursework = Classroom.Courses.CourseWork.list('valid courseId');

我收到“调用者没有权限”错误。不过,我可以使用 APIs Explorer 成功检索课程作业列表。

从使用 APIs Explorer 来看,此命令似乎需要“classroom.coursework.students.readonly”范围。但是,当我在权限对话框中点击“允许”按钮时,该范围不会添加到我的项目中。有没有办法将它添加到项目的范围列表中?我已经搜索过 SO 并看到在其他语言中提到设置范围(例如python),但在 Apps 脚本中没有。我还看到在 Apps 脚本中提到某人 authorizing a scope manually,但没有说明如何做到这一点。

我在这方面遇到了困难,所以如果有人有建议,我会非常感激。谢谢。

【问题讨论】:

    标签: google-apps-script google-api google-classroom


    【解决方案1】:

    正如thread 中所述,确保应用脚本与正确的开发控制台项目相关联。

    脚本应与与所使用的 OAuth 2.0 客户端 ID 对应的开发控制台项目 ID 相关联(此开发控制台项目还应启用“Apps Script Execution API”)。

    要更改应用脚本的开发者控制台项目,请选择以下菜单项:资源 > 开发者控制台项目...

    在此屏幕上输入您的开发控制台的项目编号。

    您必须提供有效的 OAuth 令牌才能使用 API,这需要开发者控制台项目。

    【讨论】:

    • 如果我没有正确设置这些东西,课程列表调用不会失败吗?它没有。我可以获得课程列表和学生名册,而不是课程作业列表。我发现这个thread 可能是相关的,说明课堂服务提示输入一组固定的范围。该集合不包括 coursework.students。这是否意味着我无法访问课程作业?
    • 我已编辑问题以包含指向以前线程的链接。这个thread 表示Apps Script for Classroom 中的范围是固定的。有解决办法吗?
    【解决方案2】:

    我有同样的问题 - 当作为项目的老师运行 Google Apps 脚本插件时,对 Courses.CourseWork.list 的调用工作正常。

    当我切换到在课程中以学生身份运行相同的脚本插件时,我会收到“调用者没有权限”错误。

    插件的开发者无法控制这一点,因为除了打开 Classroom API 之外,范围也无法由开发者控制。

    核心问题是 - 代码适用于课程教师。课程学生的代码失败。

    所有这一切,而 Classroom APi 参考本身工作正常。 https://developers.google.com/classroom/reference/rest/v1/courses.courseWork/list

    这很可能是一个错误——至少,与上面@abielita 给出的通用包罗万象的答案无关。

    我看到这个错误很老,所以我对答案的希望不大,但希望如此。

    【讨论】:

      【解决方案3】:

      我作为域管理员和我正在测试的课程的老师重复运行代码时遇到此错误(即我真的应该有权访问)。

      为了找出权限问题,我尝试调用 Classroom.Courses.CourseWork.create,这触发了另一个授权对话框,其中包括访问课程作业的额外权限。即使我的创建调用失败(我仍在使用 API 并且语法不正确),但它触发的权限是我正确获取课程列表所需要的。

      简而言之,这是最初因您描述的权限错误而失败的代码:

      function getCoursework(id) {
        var resp = Classroom.Courses.CourseWork.list(id);
        work = resp.courseWork
        if (work && work.length > 0) {
          for (var i=0; i< work.length; i++) {
            piece = work[i]
            Logger.log('Work: %s (%s)',piece.title,JSON.stringify(piece));
          }
        }
      }
      

      该代码没有触发权限对话框,因为它应该触发。但是,一旦我运行了以下(损坏的)代码,我确实得到了一个权限对话框,然后上面的代码就起作用了:

      function createCoursework (id) {
        Classroom.Courses.CourseWork.create(id,
          { // doesn't work but triggers permissions correctly
        "courseId": id,
        "title": 'foo',
        "description": 'desc',
          });
      }
      

      【讨论】:

      • 请注意,只需在脚本的注释中包含创建存根即可触发 所有 必要范围:// Classroom.Courses.CourseWork.create(courseId)
      【解决方案4】:

      最初是由我在this SO thread 发送的。

      此任务的相应 Classroom API 参考是 here

      看起来即使启用 高级 Google 服务...,您也只会添加以下 OAuth 范围 -

      您可以通过导航到 文件 > 项目属性 > 范围来查看这些内容。

      但是,当您从文档链接尝试 API 时,在 Credentials > Google OAuth 2.0 选项卡下,它显示了另外 4 个完全不同的 OAuth 范围;如下-

      您需要在您的 Apps 脚本清单文件中手动添加所有 8 个。为此,导航至查看并检查显示清单文件。您需要在此处添加此代码,可能在依赖项下方 -

      "oauthScopes": [
        "https://www.googleapis.com/auth/classroom.courses",
        "https://www.googleapis.com/auth/classroom.coursework.me.readonly",
        "https://www.googleapis.com/auth/classroom.profile.emails",
        "https://www.googleapis.com/auth/classroom.profile.photos",
        "https://www.googleapis.com/auth/classroom.rosters",
      
        "https://www.googleapis.com/auth/classroom.coursework.me",
        "https://www.googleapis.com/auth/classroom.coursework.me.readonly",
        "https://www.googleapis.com/auth/classroom.coursework.students",
        "https://www.googleapis.com/auth/classroom.coursework.students.readonly"
      ],
      

      注意 1:仅添加较新的 4 不会起作用,因为脚本会假定只有这些而不是原始的 5 在您的脚本第一次运行时自动填充。

      注意2:空白行只是为了区分自动生成的范围与您需要手动添加的范围(它是多余的)。

      我的appsscript.json 文件如下所示;你的可能会有所不同 -

      {
        "timeZone": "Asia/Kolkata",
        "dependencies": {
          "enabledAdvancedServices": [{
            "userSymbol": "Classroom",
            "serviceId": "classroom",
            "version": "v1"
          }]
        },
        "oauthScopes": [
          "https://www.googleapis.com/auth/classroom.courses",
          "https://www.googleapis.com/auth/classroom.coursework.me.readonly",
          "https://www.googleapis.com/auth/classroom.profile.emails",
          "https://www.googleapis.com/auth/classroom.profile.photos",
          "https://www.googleapis.com/auth/classroom.rosters",
      
          "https://www.googleapis.com/auth/classroom.coursework.me",
          "https://www.googleapis.com/auth/classroom.coursework.me.readonly",
          "https://www.googleapis.com/auth/classroom.coursework.students",
          "https://www.googleapis.com/auth/classroom.coursework.students.readonly"
        ],
        "exceptionLogging": "STACKDRIVER"
      }
      

      【讨论】:

      • 没有必要手动添加这些缺失的范围。可以通过包含以下评论来强制提示适当的身份验证(受@Tom Hinkle 在his answer 中的观察启发):// Classroom.Courses.CourseWork.create(courseId)
      • 唯一一个对我有用。也许以前的努力也做了一些事情:stackoverflow.com/questions/38949318/…
      猜你喜欢
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多