2010年11月20日土曜日

Evernote API を使ってみる (2) 認証

Evernote サービスのクライアントを作成して、認証するまで。正しく認証されると、認証トークンがもらえ、そのあとは取得した認証トークンを使ってRPCできるようになる。
具体的には以下の3つのステップを踏む。
  1. Evernote サービスのURLを指定してUserStore.Client というクラスを初期化
  2. バージョンチェック
  3. consumer key, consumer secret, user name, password で認証
細かいコーディングはサンプルを参照すればOK, 一応こんな感じで。

public class AuthTest {

    private static String consumerKey = "consumer key";
    private static String consumerSecret = "consumer secret";
    private static String evernoteHost = "sandbox.evernote.com";
    private static String userName = "user name";
    private static String password = "password";

    private UserStore.Client setupUserStore() throws TException {
        // 1. UserStore クライアントのセットアップ
        String userStoreUrl = "https://" + evernoteHost + "/edam/user";
        THttpClient trans = new THttpClient(userStoreUrl);
        TBinaryProtocol prot = new TBinaryProtocol(trans);
        UserStore.Client userStore = new UserStore.Client(prot);
        
        // 2. バージョンチェック
        boolean versionOk = userStore.checkVersion("Evernote's EDAMDemo (Java)",
                com.evernote.edam.userstore.Constants.EDAM_VERSION_MAJOR,
                com.evernote.edam.userstore.Constants.EDAM_VERSION_MINOR);
        if (!versionOk) {
            System.err.println("Incomatible EDAM client protocol version");
        }
        return userStore;
    }
    
    private boolean authenticate(UserStore.Client userStore) throws EDAMSystemException, TException {
        // 3. ユーザー認証
        AuthenticationResult authResult = null;
        try {
            authResult = userStore.authenticate(userName, password, consumerKey, consumerSecret);
            User user = authResult.getUser(); // 認証されたユーザー
            String authToken = authResult.getAuthenticationToken(); // 認証トークン
            System.out.println("ユーザー  " + user.getName() + " が認証されました。");
            System.out.println("Authentication Token: " + authToken);
        } catch (EDAMUserException ex) {
            // 例外処理
            String parameter = ex.getParameter(); // パラメータ
            EDAMErrorCode errorCode = ex.getErrorCode(); // エラーコード
          
            System.err.println("Authentication failed (parameter: " + parameter + " errorCode: " + errorCode + ")");
            // 認証に失敗した場合
            if (errorCode == EDAMErrorCode.INVALID_AUTH) {
                // consumer key が不正
                if (parameter.equals("consumerKey")) {
                    System.err.println("Your consumer key was not accepted by " + evernoteHost);
                    System.err.println("If you do not have an API Key from Evernote, you can request one from http://www.evernote.com/about/developer/api");
                // user name が不正
                } else if (parameter.equals("username")) {
                    System.err.println("You must authenticate using a username and password from " + evernoteHost);
                // password が不正
                } else if (parameter.equals("password")) {
                    System.err.println("The password that you entered is incorrect");
                }
            }
            return false;
        }
        return true;
    }
    
    public static void main(String[] args) {
        AuthTest test = new AuthTest();
        try {
            UserStore.Client userStore = test.setupUserStore();
            test.authenticate(userStore);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
}

実行して、ユーザ名と認証トークンがコンソールに表示されれば認証成功。
ユーザー XXX が認証されました。
Authentication Token:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

0 件のコメント:

コメントを投稿