4

我是 Google Apps for Education 的学习主管和学校管理员。

我将 Google Apps Script 用于许多使用 gas 服务的应用程序(控制缺勤、发送电子邮件、自动报告、ScriptDb 数据库等)。这是梦幻般的。

基本上我需要在学生的 Google Drive 中创建一个文件夹结构(年份、课程、教师等)。

使用 Google Apps 脚本服务,我可以轻松地做到这一点,但文件夹属于创建者(管理员),我认为用户会花费管理员存储配额。我对此不感兴趣。(是的,我可以制作一个由用户执行的应用程序并在其 Google Drive 中创建结构,但我宁愿以自动化方式进行,无需干预)

要在 Google Drive 中创建此文档(和文件夹),用户(教师、学生等)已调整 Waqar Ahmad 在此响应中提供的代码 [将作者添加到电子表格... ]

这使我可以使用 Google Document List API(Google Apps 管理访问权限以模拟域用户)获取其他用户的文档以进行更新,并且还可以在其他 Google Drive 用户上创建文件夹和文件。它完美地工作。我在这里提到:

如何添加 Google Drive 文件夹...

但是现在,Google Documents List AP 第 3 版已被正式弃用,并鼓励我们使用 Google API Drive。

我尝试对这个新的 Google API 做同样的事情。有没有人设法做到这一点?可能吗?我不知道从哪里开始!

谢谢你。

塞尔吉

更新:

这是我正在工作的代码,但我收到“无效请求”错误:

(...)

  var user = e.parameter.TB_email // I get user from a TextBox

//https://developers.google.com/accounts/docs/OAuth2ServiceAccount
//{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}

//{Base64url encoded header}
 var header = '{"alg":"RS256","typ":"JWT"}' 
 var header_b64e = Utilities.base64Encode(header)

//{Base64url encoded claim set}
 var t_ara = Math.round((new Date().getTime())/1000) // now 
 var t_fins = t_ara + 3600                           // t + 3600 sec


 var claim_set = '{"iss":"1111111111-xxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com",'+
                 '"prn":"' + user + '",' +
                 '"scope":"https://www.googleapis.com/auth/prediction",'+
                 '"aud":"https://accounts.google.com/o/oauth2/token",'+
                 '"exp":'+t_fins+','+
                 '"iat":'+t_ara+'}'

   // where '1111111111-xxxxxxxxxxx... is my CLIENT-ID (API Access -> Service Account)                   


 var claim_set_b64e = Utilities.base64Encode(claim_set)
 claim_set_b64e = claim_set_b64e.replace(/=/g,'')


 var to_sign = header_b64e + '.' + claim_set_b64e

 // [signature bytes] ???  // password 'isnotasecret???'
 var key_secret = DocsList.getFileById('0Biiiiiiiiii-XXXXXXXXXXX').getBlob().getBytes()

    // where '0Biiiiiiiiii-XXXXXXXXXXX'... is my p12 file (key_secret) uploaded to GDRive
    // I don't know if this is correct !!!

 var sign = Utilities.base64Encode(Utilities.computeHmacSha256Signature(to_sign, key_secret))


 var JWT_signed = to_sign + '.' + sign
 JWT_signed = JWT_signed.replace(/=/g,'')

 // Token Request /////////////////////////////////////////////////////////////
 var url = 'https://accounts.google.com/o/oauth2/token'
   //var url = 'https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Ftoken' ???
   //var url = 'https:' + '%2F%2Faccounts.google.com%2Fo%2Foauth2%2Ftoken' ???

 var parameters = {
 "method" : "POST",
 "payload" : '"' + 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=' + JWT_signed + '"',
 "contentType" : "application/x-www-form-urlencoded"
 }

 var content = UrlFetchApp.fetch(url,parameters) //.getContentText()
 // Token Request end ////////////////////////////////////////////////////////

我得到一个“无效请求”而不是带有令牌的 JSON

前两个部分(标题和声明集)都可以。结果与 Google OAuth 页面的结果相同。

我不知道签名部分是否正确,或者错误是否在令牌请求中。

4

1 回答 1

2

上面示例的问题在于它使用 hmacsha256 计算签名。您需要使用 rsasha256。现在有两个用于应用程序脚本的服务帐户库。我放在一起的是: https ://gist.github.com/Spencer-Easton/f8dad65932bff4c9efc1

这两个库的问题是它们都是从 jsrsa 派生的,它在服务器端运行非常慢。

于 2015-01-20T21:48:25.960 回答