2014-01-29 2 views
1

Я пытаюсь использовать метод Google oAuth2 в Google Apps Script, создав дескриптор JWS/JWT.Выполнение SHA256withRSA с помощью скрипта Google Apps

Теперь я могу прочитать ключевой файл с диска или, возможно, из другого источника, но как мне его подписать с этим файлом? Существуют ли какие-либо методы или части JavaSCript для этого?

function Auth20(user) { 
var header = Utilities.base64Encode(JSON.stringify({"alg":"RS256","typ":"JWT"})); 
var claimdata = { 
"iss":"[email protected]", 
      "prn": user, 
      "scope":"https://www.googleapis.com/auth/plus.circles.read", 
      "aud":"https://accounts.google.com/o/oauth2/token", 
       "exp":new Date().getTime()/1000, 
       "iat":(new Date().getTime()/1000)+3600 
       } 
var claim = Utilities.base64Encode(JSON.stringify(claimdata)) 

var jws = header+"."+claim; 
var jwsbytes = []; 

for (var i = 0; i < jws.length; ++i) 
{ 
jwsbytes.push(jws.charCodeAt(i)); 
} 
    var key = DriveApp.getFileById("0B_5HSTQXtXmsU29fTE5xNWhvOVE").getBlob() 
+0

Hi @Riel, вы нашли решение вашей проблемы? – user3355018

+0

Несчастливо, нет. –

+0

Теперь это встроено в скрипт Google Apps и поэтому разрешено. –

ответ

2

Функцию как тот, что ниже, должен сделать трюк. Следует отметить две вещи:

1) Частный ключ должен быть в формате ЧАСТНОГО КЛЮЧА, а не RSA PRIVATE KEY. Если ваш ключ является последним, вам понадобится openssl, который позволит вам запустить следующее для вашего ключа, хранящегося в файле private.pem. Отметим также формат строки с явной \n при использовании в ГАЗ:

openssl pkcs8 -topk8 -inform pem -in private.pem -outform pem -nocrypt -out newPrivate.pem  

2) Utilities.base64EncodeWebSafe() может возвращать концевую прокладку в форме = знаков. Они должны быть удалены, поэтому мое включение шагов с .replace(/=+$/, '')

Собирает все вместе:

function Auth20(user) { 
    var privateKey = "-----BEGIN PRIVATE KEY-----\n{privatekeyhere}\n-----END PRIVATE KEY-----\n" 
    var header = { 
    alg: 'RS256', 
    typ: 'JWT' 
    }; 
    var now = new Date(); 
    var claimSet = { 
    iss: {your_iss}, 
    prn: user, 
    scope: "https://www.googleapis.com/auth/plus.circles.read", 
    aud:"https://accounts.google.com/o/oauth2/token", 
    exp: (now.getTime()/1000) + 3000, 
    iat: now.getTime()/1000 
    }; 
    var toSign = Utilities.base64EncodeWebSafe(JSON.stringify(header)) + '.' + Utilities.base64EncodeWebSafe(JSON.stringify(claimSet)); 
    toSign = toSign.replace(/=+$/, ''); 
    var signatureBytes = Utilities.computeRsaSha256Signature(toSign, privateKey); 
    var signature = Utilities.base64EncodeWebSafe(signatureBytes); 
    signature = signature.replace(/=+$/, ''); 
    return toSign + '.' + signature; 
}; 
+0

Ницца, спасибо. Поскольку метод кодирования был добавлен в класс Utilities, он выполним! Ответ на этот вопрос. –

1

я использовать kjur https://kjur.github.io/jsrsasign/

load('auth/jsrsasign-latest-all-min.js'); 

var sHead=JSON.stringify({"alg":"RS256","typ":"JWT"});  
     var iat=timeStampf(); 
     var exp=iat+3600; 
     var sPayload=JSON.stringify({ 
        "iss":client_email, 
        "scope":scope,     
        "aud":"https://www.googleapis.com/oauth2/v3/token", 
        "exp":exp, 
        "iat":iat 
       });  
     var sJWS = KJUR.jws.JWS.sign("RS256", sHead,sPayload, private_key); 

переменная sJWS является головка (base64) .playload (base64) .token (base64) маркер генерируется с sha256withrsa "RS256"

Смежные вопросы