首页 > 解决方案 > 谷歌课堂 OAuth 集成 Spring Boot

问题描述

我正在使用 Spring Boot 和 JSF 创建一个 Web 应用程序,我的目的是从我的应用程序在谷歌课堂中创建课程。

我按照谷歌的例子通过 Oauth 认证自己:https ://url.miapp.io/oS2mx

从示例中实现 ClassroomQuickstart 类,但是当您在我的 Web 应用程序中使用方法 getService() 时,它会在 Tomcat 嵌入式控制台(Spring Boot)中向我发送一个 Google URL,以便我自己从浏览器进行身份验证,我可以继续我的代码流程。

换句话说,身份验证在交互模式下工作,等待我从浏览器进行身份验证,以便应用程序可以继续执行流程,我不知道我应该做什么,所以我不必以这种方式对自己进行身份验证,我不知道是按原样实现它的代码还是与谷歌开发者控制台中的配置有关。

标签: spring-bootoauth-2.0google-classroom

解决方案


三足 OAuth:

您目前正在遵循一个三足 OAuth 流程,其中涉及三方:(#1) 最终用户、(#2) 应用程序和 (#3) 授权服务器。在此 OAuth 流程中,用户需要通过浏览器通过同意屏幕明确同意应用程序

2 足 OAuth:

既然你想避免这种情况,你应该使用服务帐户来访问这个应用程序,这样用户就不会直接参与,也不需要用户同意。此工作流通常称为 2-legged OAuth(仅涉及应用程序和授权服务器)。有关更深入的说明,请参阅将 OAuth 2.0 用于服务器到服务器应用程序。

由于您不希望服务帐户自己运行应用程序,而是代表域中的其他帐户进行操作,因此您应该授予它域范围的权限,以便它可以模拟域中的其他帐户

工作流程:

为此,您必须执行以下步骤:

  • 按照本指南创建服务帐户。
  • 将域范围的权限委托给服务帐户(您必须是域管理员才能执行此操作):此步骤授权服务帐户代表域中的任何用户访问数据。按照此处指示的步骤进行操作。
  • 一旦您委派了域范围的权限,您就必须修改与构建 OAuth 凭据相关的代码。例如,使用此答案中提供的代码示例:
GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId("service-account@email-address") // Service account email
    .setServiceAccountPrivateKeyFromP12File(new File("your-credentials.p12"))
    .setServiceAccountScopes(Collections.singleton(ClassroomScopes.CLASSROOM_COURSES))
    .setServiceAccountUser("user@email-address") // Your email address (address of the user you want to impersonate)
    .build();

在这种情况下,user@email-address指的是应为其创建课程的帐户。换句话说,它将是服务帐户应该模拟的帐户。关于该P12文件,应从 Cloud Console 下载,如此处所述。这可以通过JSON文件而不是P12(参见此处)来完成。

参考:


推荐阅读