我是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派生的,它在服务器端运行得非常慢.