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;
 }

・・・


0 件のコメント:

コメントを投稿