2013-11-15 2 views
3

Я пытаюсь создать веб-токен JSON, чтобы использовать его для создания вызова токена обновления с доступом к API Google Analytics. Я применил подход учетной записи службы.Создание веб-токена JSON в Java

В соответствии с этим подходом мне нужно:

  1. Создать учетную запись службы
  2. Добавьте адрес электронной почты, созданный для приложения Analytics с учетом Google Analytics.
  3. Загрузить файл ключа priavte (.p12)
  4. Используйте этот ключ priavate и адрес электронной почты для создания JWT, который впоследствии будет использоваться для вызова HTTP POST на сервер google auth для получения токена обновления.

Я не уверен, является ли мой подход к созданию JWT правильным или нет. Образец, доступный как JWT_Handler.java на сайте Google Code, рассказывает о создании JWT с частью претензии и запросе полезной информации только с отсутствием заголовка и подписи. Это сбивает с толку с руководящей Googles для создания JWT для обновления маркеров, где JWT включает в себя три части:

  1. JWT Заголовок
  2. JWT Претензия
  3. Подписи

Всех трех частей Base64Url кодированный. Я пробовал следующий код:

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.nio.charset.Charset; 
import java.security.KeyStore; 
import java.security.PrivateKey; 
import java.security.Signature; 
import java.util.Calendar; 
import java.util.Enumeration; 

import com.google.api.client.util.Base64; 
import com.google.gson.JsonObject; 
public class TestJWT { 

private final static Charset UTF8_CHARSET = Charset.forName("UTF-8"); 
private static KeyStore myStore = null; 
private static FileInputStream in_cert = null; 
public static void main(String[] args) { 
    PrivateKey privateKey = null;  
    try { 
     in_cert = new FileInputStream(
       "D://Google Analytics//ClientLogin//Analytics//%$%%$%$%-privatekey.p12"); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    }  
    try { 
     myStore = KeyStore.getInstance("PKCS12"); 
     myStore.load(in_cert, "notasecret".toCharArray()); 
     String alias = "";  
     Enumeration objEnumeration = myStore.aliases(); 
     while (objEnumeration.hasMoreElements() == true) { 
      alias = (String) objEnumeration.nextElement();    
      privateKey = (PrivateKey) myStore.getKey(alias, 
        "notasecret".toCharArray()); 
     } 
    } catch (Exception e1) { 
     e1.printStackTrace(); 
    } 

    JsonObject header = new JsonObject(); 
    header.addProperty("alg", "RS256"); 
    header.addProperty("typ", "JWT"); 

    Calendar cal = Calendar.getInstance();  
    cal.set(1970, 01, 01);  
    String iat = Long.toString((System.currentTimeMillis() - cal.getTimeInMillis())/1000); 
    String exp = Long.toString((System.currentTimeMillis() - cal.getTimeInMillis())/1000 + 60000L); 

    JsonObject claim = new JsonObject(); 
    claim.addProperty("iss", "$$%$^%&^!%@#[email protected]"); 
    claim.addProperty("scope", "https://www.googleapis.com/auth/devstorage.readonly"); 
    claim.addProperty("aud", "https://accounts.google.com/o/oauth2/token"); 
    claim.addProperty("access_type", "offline"); 
    claim.addProperty("exp", exp); 
    claim.addProperty("iat", iat); 


    System.out.println("Header : " + header); 
    String headerStr = header.toString(); 
    System.out.println("claim : " + claim); 
    String claimStr = claim.toString(); 


    try { 

     byte[] headerArr = headerStr.getBytes(UTF8_CHARSET); 
     System.out.println(Base64.encodeBase64String(headerArr)); 

     byte[] claimArr = claimStr.getBytes(UTF8_CHARSET); 
     System.out.println(Base64.encodeBase64String(claimArr)); 

     String inputStr = Base64.encodeBase64String(headerArr) + "." + Base64.encodeBase64String(claimArr); 

     System.out.println("Input String : " + inputStr); 
     Signature signature = Signature.getInstance("SHA256withRSA"); 
     signature.initSign(privateKey); 
     signature.update(inputStr.getBytes(UTF8_CHARSET)); 
     System.out.println("Sign : " + signature.sign()); 

     System.out.println("Base64url encoded sign : " + Base64.encodeBase64String(signature.sign())); 

     System.out.println("Final JWT : " + Base64.encodeBase64String(headerArr) + "." + Base64.encodeBase64String(claimArr) + "." + Base64.encodeBase64String(signature.sign())); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

} 

ответ

1

Prathamesh, это тот же вопрос, что и ваш другой пост? (Making Refresh Token Request In Java With JWT through a stand alone application - Not a Web App)

Чтобы уточнить, подписание JWT с использованием файла P12 позволит вам получить токен доступа (а не токен обновления). Это нормально, потому что токен доступа - это то, что вам нужно для последующего вызова API.

я настоятельно предлагаю с помощью клиентской библиотеки Java Google, чтобы построить JWT и сделать подписание, о котором вы уже вставили хороший образец для в другом посте:

GoogleCredential credentialGA = new GoogleCredential.Builder().setTransport(httpTransport) 
     .setJsonFactory(JSON_FACTORY) 
     .setServiceAccountId("$#[email protected]#$#$#[email protected]") 
     .setServiceAccountScopes(Collections.singleton(AnalyticsScopes.ANALYTICS_READONLY)) 
     .setServiceAccountPrivateKeyFromP12File(new File("$#$#$%$%$%$-privatekey.p12")) 
     .build(); 
this.analytics = new Analytics.Builder(httpTransport, JSON_FACTORY, credentialGA).setApplicationName("Demo App").build(); 

Есть ли конкретная причина, вы не» t хотите использовать клиентскую библиотеку? Он позаботится о создании JWT, подписании его, его отправке, создании запросов на обслуживание, добавлении заголовков авторизации, обновлении токена доступа, когда он истечет и т. Д. И т. Д.

+0

Честно говоря, у меня не было образца кода для искать или использовать любой API-интерфейс для использования библиотеки Google Client для создания JWT. У меня есть пример для генерации JWT в случае Google Кошелька. В этом примере не показано создание JWT с использованием заголовка для API Google Analytics. Именно по этой причине мне пришлось прибегнуть к созданию этого образца кода. У меня была эта большая проблема получения токена обновления, для которого я думал, что создание подписанного JWT было первым шагом. Другая тема говорит о более большой проблеме. Извините, если возникла какая-либо путаница. –

+0

Но все равно было бы полезно, если бы руководство по созданию подписанного JWT для Google Analytics. –

+0

ОК, я думаю, я могу видеть, где замешательство. Вы должны иметь возможность использовать один и тот же код для создания подписанного JWT независимо от того, какой API Google вы пытаетесь получить. Ключевое различие заключается в изменении областей, которые вы запрашиваете, которые выглядят так, как вы уже сделали. Можете ли вы подтвердить, работает ли этот код выше для вас? (А если нет, то какую ошибку вы получаете?) – aeijdenberg

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