JWT を使用して Google アナリティクスのリフレッシュ トークンを取得する方法について質問があります。
正常に動作している以下のサンプル コードを参照してください。Analytics オブジェクトを取得できます。これを使用して、Analytics データにアクセスできます。
GoogleCredential credentialGA = new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("$#$@#$#$#$@developer.gserviceaccount.com")
.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();
credentialGA.getAccessToken()を呼び出すと、文字列が返されます。しかし、 credentialGA.getRefreshToken()を呼び出すと、 常に null が返されます。今後の呼び出しにこの Analytics オブジェクトを使用する必要がある場合は、GoogleCredential オブジェクトを再度作成して Analytics オブジェクトを取得できるリフレッシュ トークンが必要です。
https://developers.google.com/accounts/docs/OAuth2ServiceAccountに記載されている手順に従って、JWT を作成しました。この JWT は、リフレッシュ トークンの呼び出しに使用されます。このリンクで共有されている例では、servlet/jsp/http を介してそれを可能にする方法を説明しています。 https://code.google.com/p/gwdg-java/source/browse/src/java/com/google/iapsample/?r=a52c4e72381b1fc959053e3a1fc8c585ae2d7112
Javaスタンドアロンアプリを使用してJWTを使用してリフレッシュトークン呼び出しの同じタスクを達成することを説明するコード例はありますか?
前もって感謝します。
よろしく、 プラサメシュ
JWT を生成するコード:
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());
Enumeration<String> aliases = myStore.aliases();
String alias = "";
Enumeration objEnumeration = myStore.aliases();
while (objEnumeration.hasMoreElements() == true) {
alias = (String) objEnumeration.nextElement();
privateKey = (PrivateKey) myStore.getKey(alias,
"notasecret".toCharArray());
if(privateKey != null){
System.out.println("PRIVATE KEY:" + privateKey.toString());
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
JsonObject header = new JsonObject();
header.addProperty("alg", "RS256");
header.addProperty("typ", "JWT");
String headerStr = header.toString();
JsonObject claim = new JsonObject();
claim.addProperty("iss", "%^@%@^%$%@developer.gserviceaccount.com");
claim.addProperty("scope", "https://www.googleapis.com/auth/devstorage.readonly");
claim.addProperty("aud", "https://accounts.google.com/o/oauth2/token");
claim.addProperty("exp", "1384497516");
claim.addProperty("iat", "1384597516");
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);
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(inputStr.getBytes(UTF8_CHARSET));
} catch (Exception e) {
e.printStackTrace();
}
次に、この JWT 文字列がコピーされ、別のプログラマーで使用されて、以下に示すように更新トークンを要求します。
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("<link i have posted in the comment>");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("grant_type",
"urn:ietf:params:oauth:grant-type:jwt-bearer"));
nameValuePairs.add(new BasicNameValuePair("assertion",
"<JWT Calculated earlier>"));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(post);
BufferedReader rd = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
System.out.println(line);
if (line.startsWith("Auth=")) {
String key = line.substring(5);
}
}
} catch (IOException e) {
e.printStackTrace();
}