【发布时间】:2020-03-29 04:07:33
【问题描述】:
我已阅读与该问题相关的所有堆栈溢出问题。我对此有所了解,但它无法帮助我解决这个问题。
我已使用服务帐户进行授权。因为我不想为我的用户显示授权屏幕。因此,我在 GoogleAPI 控制台中创建了服务帐户并启用了域范围的授权。
我需要以编程方式在用户的 Google 课堂中创建课程。我已经按照 java Quickstart 使用了 OAuth 客户端 ID 和 OAuth 客户端密码。完成后授权令牌已经存储在项目目录中。使用这个令牌,我可以在授权用户的谷歌教室中创建课程。因为我需要为我域中的许多用户在谷歌课堂上创建课程。所以我使用了服务帐户。当我尝试实现它时,我得到了上述错误。
我已经在 Web 应用程序中实现了它。为了更好地理解和代码可读性,我创建了一个快速入门 maven 项目并粘贴了代码。代码运行良好,直到 System.out.println("Entering to list course method: "); 行。
1) 如何解决这个问题?
2) 会要求管理员授权吗?因为为了访问用户数据,我们需要访问令牌。如何使用服务帐户获取访问令牌?
public class ClassroomServiceAccount {
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String SERVICE_ACCOUNT_EMAIL = "xxxxxxx@projectName.iam.gserviceaccount.com";
private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH = "/MyProject.p12";
private static final List<String> SCOPES = Arrays.asList(ClassroomScopes.CLASSROOM_COURSES, ClassroomScopes.CLASSROOM_TOPICS, ClassroomScopes.CLASSROOM_ANNOUNCEMENTS);
public static void main(String... args) throws IOException, GeneralSecurityException {
HttpTransport httpTransport = new NetHttpTransport();
InputStream in = ClassroomServiceAccount.class.getResourceAsStream(SERVICE_ACCOUNT_PKCS12_FILE_PATH);
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(in, "notasecret".toCharArray());
String alias = "key1";
Key key = keystore.getKey(alias, "notasecret".toCharArray());
// Get certificate of public key
Certificate cert = keystore.getCertificate(alias);
// Get public key
PublicKey publicKey = cert.getPublicKey();
System.out.println("This is public key : "+ publicKey);
// Return a key pair
KeyPair k = new KeyPair(publicKey, (PrivateKey) key);
System.out.println("This is k : "+ k.getPrivate());
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountPrivateKey(k.getPrivate())
.setServiceAccountScopes(SCOPES)
.setServiceAccountUser("email@yourdomain.com")
.build();
System.out.println("credentials : " + credential.getServiceAccountPrivateKey());
Classroom service = new Classroom.Builder(httpTransport, JSON_FACTORY, null)
.setApplicationName(APPLICATION_NAME)
.setHttpRequestInitializer(credential)
.build();
// Create courses in users google classroom
Course course = new Course();
course.setOwnerId("user@yourdomain.com");
course.setName("Science");
service.courses().create(course).execute();
}
}
【问题讨论】:
-
您是否从服务帐户创建了
key?令牌在那里。 -
是的。我已经下载了 .p12 密钥。你可以在我的代码中看到它。即私有静态最终字符串SERVICE_ACCOUNT_PKCS12_FILE_PATH = "/MyProject.p12";
-
@Jescanellas 我从 .p12 文件中获取了私钥并将其传递到凭据中(setServiceAccountPrivateKey)。我已经提到了这个答案stackoverflow.com/questions/18621508/…
-
我明白了。不要使用该帖子,因为它是 2013 年的,并且已经过时了。尝试从同一 Quickstart 复制第 3 步授权。
-
@Jescanellas 我可以使用该快速入门创建课程。他们使用 OAuth 客户端 ID。但我的问题不同。我想使用服务帐户,因为它可以使用机器人帐户启用服务器到服务器、应用级别的身份验证。
标签: java google-api google-oauth google-admin-sdk google-classroom