2013-04-24 4 views
1

Я пытаюсь получить токен OAuth2, чтобы использовать его в методе GET BUCKET в заголовке авторизации.Ошибка invalid_grant с учетной записью службы облачной службы Google

Я передаю grant_type и утверждение, как указано в следующей ссылке, чтобы получить маркер: https://developers.google.com/accounts/docs/OAuth2ServiceAccount#libraries

Что вызывает invalid_grant в ответ?

Спасибо!

ответ

1

Решает эту проблему. Я назначал другое значение «истечение», которое требуется в контенте. теперь он работает с

long currenttime = System.currentTimeMillis(); 
long now = currenttime/1000; 
long expiration = currenttime/1000 + 3600; 

и со следующими

String temp = JWTBase64Header + "." + JWTBase64Content; 
byte[] JWTSignatureInput = temp.getBytes("UTF8"); 

final String keyFile = "xx9d9xxxxxx12cd99fxxxx60bxxxxx1-privatekey.p12"; 
final String keyPassword = "notasecret"; 
PrivateKey pkcsKey = loadKeyFromPkcs12(keyFile, keyPassword.toCharArray()); 
String JWTBase64Signature = signData(pkcsKey, new String(JWTSignatureInput, "UTF8")); 

String params = "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion="+JWTBase64Header + "." + JWTBase64Content + "." 
     + JWTBase64Signature; 

URL url = new URL("https://accounts.google.com/o/oauth2/token"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoOutput(true); 
conn.setRequestMethod("POST"); 
conn.setRequestProperty("Accept", "application/x-www-form-urlencoded"); 
conn.setRequestProperty("Content-Length", Integer.toString(params.getBytes().length)); 

//Send request 

    DataOutputStream wr = new DataOutputStream (
       conn.getOutputStream()); 
    wr.writeBytes (params.toString()); 
    wr.flush(); 
    wr.close(); 

теперь просто получить InputStream от соединения и разобрать его, чтобы получить access_token.

+1

Hiral Это пример, который я могу найти, поскольку я пытаюсь получить действительный токен в сценарии приложения Server to Server. Ваши методы: signData и loadKeyFromPkcs12, вы их написали или они существуют в библиотеке криптографии? – kstubs

+0

Я написал эти 2 метода, его НЕ является частью библиотеки криптографии – Hiral

0
private static PrivateKey loadKeyFromPkcs12(String filename, char[] password) 
     throws Exception { 
    FileInputStream fis = new FileInputStream(
      "NewFolder/" + filename); 

    KeyStore ks = KeyStore.getInstance("PKCS12"); 
    try { 
     ks.load(fis, password); 
    } catch (IOException e) { 
     if (e.getCause() != null 
       && e.getCause() instanceof UnrecoverableKeyException) { 
      System.err.println("Incorrect password"); 
     } 
     throw e; 
    } 
    return (PrivateKey) ks.getKey("privatekey", password); 
} 

private static String signData(PrivateKey key, String data) 
     throws Exception { 
    Signature signer = Signature.getInstance("SHA256withRSA"); 
    signer.initSign(key); 
    signer.update(data.getBytes("UTF8")); 
    byte[] rawSignature = signer.sign(); 
    String encodedSignature = new String(Base64.encodeBase64URLSafe(rawSignature)); 
    return encodedSignature; 
} 
Смежные вопросы