google-apps-script – 是否可以使用Google Apps脚本模拟使用Google Drive API的域用户?

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

我使用Google Apps脚本用于许多应用程序(控制缺勤,发送电子邮件,自动报告,ScriptDb数据库等)使用燃气服务.这是梦幻般的.

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

使用Google Apps脚本服务,我可以轻松完成,但文件夹属于创建者(管理员),我认为用户会花费管理员存储空间配额.这对我不感兴趣.
(是的,我可以让应用程序由用户执行并在其Google云端硬盘中创建结构,但我宁愿以自动方式执行此操作而无需干预)

要在Google云端硬盘用户(教师,学生……)中创建此文档(和文件夹),请修改Waqar Ahmad在此回复中提供的代码[Add an writer to a spreadsheet … ]

这使我可以拥有其他用户的文档,使用Google文档列表API(Google Apps管理员访问来模拟域用户)进行更新,并且还可以在其他Google云端硬盘用户上创建文件夹和文件.它完美地运作.我在这里提到:

How to add a Google Drive folder …

但现在,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

2个第一部分(标题和声明集)都可以.结果等于Google OAuth页面的结果.

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

最佳答案 上面示例的问题在于它使用hmacsha256计算签名.你需要使用rsasha256.现在有两个用于应用程序脚本的服务帐户库.我把它放在一起的是:

https://gist.github.com/Spencer-Easton/f8dad65932bff4c9efc1

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

点赞