AWS User Pools をJavaから利用する

こんにちは。beaglesoftの真鍋です。

このところSpring Boot+AngularJSでいろいろと楽しんでいます。AngularJSは初めてなので戸惑うことも多いのですが、段々と慣れてきてとても便利なものだと感じられるようになってきました。

ところで、このところAWSを利用する機会が増えたこともあって、いろいろな機能に触れることが多くなりました。AWSはどうにも最初はとっつきにくい感じがあるのですが、使ってみると想定以上に簡単に組み込めることが多いと思うようになりましたので、AWSにあるものはそちらを利用するようにするようになってきました。

そんな中で、ユーザー情報の管理(認証を含む)がないかなぁと思っていたところAmazon Cognito Your User Pools - 一般提供を開始 | Amazon Web Services ブログ という記事を見つけました。

とりあえず、やってみようと思ったのですがいろいろとよくわからないことが多かったです。そのことはともかく、動作するようになったサンプルは以下のとおりとなります。

yoichiro-manabe/aws-user-pools-example: AWSのUser PoolsへJavaからアクセするためのサンプル

package com.company;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderClient;
import com.amazonaws.services.cognitoidp.model.*;

import java.util.Arrays;
import java.util.List;

public class UserSignupMain {

    public static final String USER_NAME_ID      = "test56";
    public static final String CLIENT_ID         = "app client idを設定";
    public static final String PASSWORD          = "aaaaaa*-123D";
    public static final String EMAIL             = "hoge@hogehoge.local";
    public static final String USER_NAME         = "abcdefg";
    public static final String PHONE_NUMBER      = "+818012345678";
    public static final String USER_POOL_ID      = "ap-northeast-1_XXXXX";
    public static final String TOKYO_REGION_NAME = "ap-northeast-1";

    public static void main(String[] args) {

        AwsServiceBase base = new AwsServiceBase();
        AWSCredentials awsCredentials = base.getAwsCredentials();
        AWSCognitoIdentityProviderClient client = new AWSCognitoIdentityProviderClient(awsCredentials);

        Regions regions = base.getRegions(TOKYO_REGION_NAME);
        client.setRegion(Region.getRegion(regions));

        System.out.println("ユーザーを作成します...");

        SignUpRequest signUpRequest = new SignUpRequest().withClientId(CLIENT_ID)
                                                         .withPassword(PASSWORD)
                                                         .withUsername(USER_NAME_ID);

        List<AttributeType> attributeDataTypes = Arrays.asList(
                new AttributeType().withName("email")
                                   .withValue(EMAIL),
                new AttributeType().withName("name")
                                   .withValue(USER_NAME),
                new AttributeType().withName("phone_number")
                                   .withValue(PHONE_NUMBER)
        );

        signUpRequest.setUserAttributes(attributeDataTypes);

        SignUpResult result = client.signUp(signUpRequest);
        if (result != null) {

            System.out.println("ユーザーが作成されました。");
            System.out.println(result.toString());
        } else {
            System.out.println("ユーザーの作成に失敗しました。");
            return;
        }

        System.out.println("追加したユーザーを取得します");

        AdminGetUserResult adminGetUserResult = client.adminGetUser(
                new AdminGetUserRequest().withUserPoolId(USER_POOL_ID)
                                         .withUsername(USER_NAME_ID));

        System.out.println(adminGetUserResult.toString());
    }

}

ちょっと思ったこと

利用してみて感じたのですが、AdminXXXのメソッドでサーバーサイドから処理を行うこともできるので、単なるユーザーストーレージとしても利用することができますね。

ただ、本来の利用方法としてはユーザーの作成と更新、ログインはクライアントとUesr Poolsで実行して認証後の具体的な処理(例えば業務データの表示とか)をUser Poolsから取得したキーをもとに認可を確認するという流れにすると楽そうです。

手書きだけど多分こんなイメージなのだろうと想像しています。

f:id:beaglesoft:20161113120135j:plain

…ということで、今回のサンプルはあんまり意味がないかもしれません。本来はAdminXXXではなくClientXXXのメソッドを使用する必要があるように思います。この辺はもう少し試してみたいと思います。

参考

そもそもRestAPIの認可について理解できていなかったので下記がとても参考になりました。

REST Security with JWT, Spring Security and Java | Toptal szerhusenBC/jwt-spring-security-demo: A small demo for using JWT (Json Web Token) with Spring Security and Spring Boot

また、IDaaSなるものがあるということは知らなかったのでこちらも大変参考になりました。

AWS Cognito User Pools は人類待望の IDaaS かも - Librabuch

SpringBootに関することはやはりこの書籍が拠になりました。SpringSecurityの構造について図でわかりやすく説明されています。

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

今読み始めたのがこちらです。Web APIについて知識や概念の理解が不足していると感じています。Rest APIを構築するということが結構これまでのことと変わるってことにあまり意識が言ってなかったので…。

Web API: The Good Parts

Web API: The Good Parts

Surface Pro4で外付けディスプレイの表示サイズを変更する

こんにちは。beaglesoftの真鍋です。

先日はSurface Pro4についていいところと悪いところを紹介しました。そういうブログを書いたあとにはやはり色々と改善できないものかと考えるらしいです。ただ、悪い所については改善できそうになかったのでちょっと不便だと感じていたことを調べてみました。

Surface Pro4は職場では外付けディスプレイを取り付けて利用しているのですが、この画面の表示サイズがすべてのディスプレイで同じ設定しかできないと思いこんでいたのでえらく不便な思いをしていました。

というのも、仕事場では比較的大きな外付けディスプレイの解像度に合わせて拡大率を小さくするのですが、外へ出たときにはSurface Pro4ではとても読めないくらいに拡大率が小さくなっているため不便を感じていたのです。(もっとも利用していたのがOneNote中心だったこともありそれほど不便ではなかったような気もしますが…。)

理想は職場など外付けディスプレイを利用するときもSurface Pro4単体で利用するときもそれぞれの解像度に合わせて表示されることが望ましいというわけです。

テキスト、アプリ、その他の項目のサイズを変更する

Surface Pro4のデスクトップを右クリックして表示されるコンテキストメニューから「ディスプレイの設定」を選択すると「ディスプレイのカスタマイズ」画面が表示されます。この画面の中に「テキスト、アプリ、その他の項目のサイズを変更する」という項目があります。下の画像は設定変更済みなのですが、最初はグレーアウトされていて「ログオフして…」という表示が出ていると思います。

f:id:beaglesoft:20161017212822p:plain

実際にこの項目をクリックしてログオフしてから再ログインするとそれぞれの画面ごとに変更ができるようになります。

まだ、Surface Pro4単体で利用していないのでなんとも言えませんが、これで一つ便利になってくれるとありがたいのですが…。

Surface Pro4を購入して3ヶ月

こんばんは。beaglesoftの真鍋です。

はやいものでSurface Pro4を購入して3ヶ月ほどたちました。Surface Pro4を購入した理由は、ペンとタブレットの利用が素晴らしいから購入したのですがその後はいかにというところをそろそろまとめておきたいと思います。

ちなみに、私が購入したSurface Pro4のスペックはメモリが16GBでSSDが256GBのモデルです。主な用途は開発から普段使いまで全てで利用しています。

マイクロソフト Surface Pro 4※Core i7/16GB/256GB モデル TH2-00014

マイクロソフト Surface Pro 4※Core i7/16GB/256GB モデル TH2-00014

いいところ

まずはいいところからです。色々と挙げだすとキリがないのですが、特にいいと思うところです。

  • ペンとタブレットでOneNoteを利用するととても便利
  • 手書きのペン先を変更したりできるので書き味を楽しめる
  • 軽くて持ち運びが楽

ペンとタブレットでOneNoteを利用するととても便利

何よりも便利なのはペンとタブレットでOneNoteを利用するととても便利ですね。これは本当に昔からOneNoteを利用していた私としては嬉しいことなのですが、Rodiaのレポートパッドの代わりにOneNoteで手書きメモを残しています。一度電車の中でも試したのですが、腕が痛くなる以外では非常に快適でした。

こんな感じでメモを手書きで書いてはテレビなどへ移して打ち合わせをしたりすることができます。

f:id:beaglesoft:20161016224324p:plain

ペンをノックするだけでOneNoteが起動して際限なくメモを書けることはとても素晴らしいの一言です。ただ、願わくばGoogleDocsのようにリアルタイムで複数人が編集できるともっといいのですが、おいおいできるようになるのでしょうね。

軽くて持ち運びが楽

Surface Pro4はモバイルPCとタブレットを合わせたようなものなのでもちろん重さは重要ですが、それほど重くはないと思います。ただ、電車の中でたった状態でタブレットを片手で持ちつつメモを取ることを30分位試したのですがちょっと腕が痛かったです。リュックを前抱えにしてその上の方に載せると比較的ラクでしたが、あまり見てくれが良くないです。

改善してほしいところ

いいところよりも悪いところが結構目立ちます。これは多分Suraface Pro4だけの問題ではないのだと思いますが…。色々と改善してほしいところはあるのですが、いいところと同じく3つだけあげようと思います。

  • スリープ状態でいつの間にかシャットダウンしている
  • Windows Helloの認証が外ではうまくいかない
  • タブレットの背面スタンドが斜めになっているせいか机に立てたときにガタつく

スリープ状態でいつの間にかシャットダウンしている

これは本当に困るのですが、スリープ状態にしたらたいてい3時間位で強制的にシャットダウンしています。なので、MacBookなどで普通にできていた開いたら前回の作業状態から再開するということができません。ほとんど毎日シャットダウンしているので最近はアプリケーションを終了して休止状態にするようになりました。

とくにIntelliJを起動していると休止状態でも90%以上の確率で終了させられているのでとても不便を感じています。

Windows Helloの認証が外ではうまくいかない

自宅や屋内ではそれほど問題になることはないのですが、Windows Helloが認証してくれずPINコードやパスワードでログインすることになります。

タブレットのメリットってやはりサクッと起動してちゃちゃっと利用できることだと思うのですが、認証にもたついてその挙句利用できずにパスワード認証をする必要があるのはちょっとつらいかなと。特に、何か思いついたときにメモしようと思って起動したけど(休止状態からの復帰ということもあり)なかなか起動しないというのはそもそもタブレットとしてどうよという話になります。

タブレットの背面スタンドが斜めになっているせいか机に立てたときにガタつく

これはいつの頃からかそのようになりました。タブレットを背面スタンドで立てたときにガタつくんですよね。多分、背面スタンドがガタついているからだと思うのですが、3ヶ月でこの状態は結構残念です。

確かに、毎日持ち運びのためにタブレットの背面スタンドを閉じたり開いたりしていますがそれにしてもそういうことを想定して作られた製品であることを考えると劣化が早すぎる気がしますね。

まとめ

こうやって見るといいところより悪いところに力が入っていますね。まぁ、普通のノートパソコンに比べると兼用である以上専門性が低いわけで、いろいろなところにヒヅミが出てくるのは仕方ないと思うのですよ。

とは言うものの、ペンとタブレットは便利だし、OneNoteは最高に素晴らしいのも事実でもう少しスペック低くてもいいからタブレット専用機として利用するほうが良かったのかなと思ってます。ノートパソコンの代わりとして利用したから色々と不満が多いのかもしれません。

おそらくハードウェア以外の部分についてはソフトウェアのアップデートで改善されるでしょうから、半年後くらいにどうなっているかが楽しみです。