ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2013年10月15日火曜日

GAEからblogger API v3を使用(OAuth)

bloggerに移行したということで、GAEのcronでblogger API v3を使ってブログ更新するようにしました。

v3から基本的には、OAuthで認証ということで、その辺の手順を中心に忘れないようにメモ。


Google Cloud ConsoleでBlogger API v3を有効化















Blogger API の「無効」ボタンを押すと下のようなページが表示されるので送信ボタンを押す。























数営業日ぐらいでGoogleさんからActivateするためのメールが送られてくるので、
そのメールの中のリンクをクリックすると、Blogger APIが有効になる。
















Google Cloud Consoleでアプリを登録する。















「アプリを登録」をクリック















「ネイティブ」を選択し登録
















クライアントIDとクライアントシークレットをメモ


Request Tokenの取得

Request Tokenを取得するためにこんな感じのHTMLを書いてブラウザで開く

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form method="get" action="https://accounts.google.com/o/oauth2/auth">
<input type="hidden" name="response_type" value="code">
<input type="hidden" name="redirect_uri" value="urn:ietf:wg:oauth:2.0:oob">
client_id:<input type="text" name="client_id" value="[クライアントID]"><br>
scope:<input type="text" name="scope" value="https://www.googleapis.com/auth/blogger"><br>
<input type="submit">
</form>
</body>
</html>









送信をクリック















BlogのユーザでGoogleにログインして、「承認する」をクリック

















「コード」をメモしておく


Access Token、Refresh Tokenの取得

Access Token、Refresh Tokenを取得するためにこんな感じのHTMLを書いてブラウザで開く

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="post" action="https://accounts.google.com/o/oauth2/token">
code:<input type="text" name="code" value="code">
<input type="hidden" name="redirect_uri" value="urn:ietf:wg:oauth:2.0:oob">
<input type="hidden" name="grant_type" value="authorization_code">
client_id:<input type="text" name="client_id" value="[クライアントID]"><br>
client_secret:<input type="text" name="client_secret" value="[クライアントシークレット]"><br>
<input type="submit">
</form>

</body>
</html>









コードのところにRequest Tokenのところで取得した”コード”を
ペーストして送信ボタンを押す。











ブラウザにAccess TokenとRefresh Tokenが表示されるので、
Refresh Tokenをメモしておく




Access TokenのRefresh

blogger APIでブログを更新する際に、Access Tokenを指定する必要があるのですが、
Access Tokenには期限があるので、上記で取得したAccessTokenは使えません。
新たなAccess Tokenを取得するには、Refresh Tokenを使用します。

Javaだと下記のような感じのコードになります。


import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;


import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

・・・
 public String getAccessToken(String refreshToken, String clientId, String clientSecret) {
     String ret = "";
     try {
                URL url = new URL("https://accounts.google.com/o/oauth2/token");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");

                List params = new ArrayList();
                params.add("refresh_token=" + refreshToken);
                params.add("client_id=" + clientId);
                params.add("client_secret=" + clientSecret);
                params.add("grant_type=refresh_token");
                OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
                String paramStr = "";
                for(String param:params) {
                 if(paramStr.length() > 0) {
              paramStr = paramStr + "&";
                 }
                 paramStr = paramStr+ param;
                }
                writer.write(paramStr);
                writer.close();
    
                if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    // OK
                 Reader reader = new InputStreamReader(connection.getInputStream());
                 JsonParser parser = new JsonParser();
                 JsonElement elem = parser.parse(reader);
                 if(elem != null) {
                 JsonObject obj = elem.getAsJsonObject();
                 if(obj != null) {
                  ret = obj.get("access_token").getAsString();
                 }
                 }
                 } else {
                    // Server returned HTTP error code.
                 }
            } catch (MalformedURLException e) {
                // ...
            } catch (IOException e) {
                 // ...
            }  
     return ret;
 }

・・・