引き続き主語大きめでお届けしております。

人類に IDaaS は早すぎた話 で IDaaS について触れました。昨日、Amazon Web Service から関連するリリースが出ました。

これまでの Cognito

これまでも Amazon Cognito は、モバイルアプリや JavaScript アプリケーションから、AWS のサービスにアクセスするための認可・認証の機能を提供していました。しかし、ユーザーのパスワードや属性情報を Cognito が保持できるわけではありませんでした。また、Webサービスにおける一般的な認可のための機能やフロー – パスワードの複雑性の管理や Emailアドレス確認のプロセス – は提供されていなかったため、いわゆる IDaaS とは同カテゴリながら少し異なる位置づけでした。

これからの Cognito

User Pools の登場によって、Cognito を本格的な IDaaS として利用開始できることが期待されます。

他の IDaaS に対する優位性は、User Pools が AWS の中に存在するという点に尽きます。サービスの継続性や堅牢性については相当のレベルで担保されることになると考えて差し支えないでしょう。一方、SDK 以上のツールは今後も提供されないと考えられるため、Auth0 の Lock のようなエレガントな認証インターフェースを実現したければ自前で実装するしかありません。この点については他の IDaaS に優位性がありそうです。

IDaaS についての補足

IDaaS というワードで調べると、サービスの種類はそこまで多くありません。しかし色々調査した結果、 BaaSmBaaS のプラットフォームの中にユーザー認証機能があり、IDaaS の役割の一部または全部を兼ねているケースのほうが多いことがわかりました。例えば、Firebaseニフティクラウド mobile backend などが該当します。IDaaS の機能のみが必要であれば IDaaS を、BaaS的ななにかも必要であれば BaaS も含めて利用サービスを検討するのが良さそうです。

ところで BaaS というと、Parse.com 終了の話題が記憶に新しいです。

Parse.com もまた、 IDaaS の機能を備えていました。BaaS 系はデータをエクスポートできるにせよ多少のロックインを覚悟する必要があるので、採用にあたりサービス継続性についてはかなり慎重な検討が必要です。その意味で、すでに AWS にロックインされている状態で(この善し悪しはともかく)AWS の BaaS サービスを選ぶのはシンプルな試みだと思います。

Cognito User Pools の気になるところ

既にドキュメントが提供されています。

いくつか要点をピックアップします。まだ少し触った程度ですので誤りがある可能性があります。

User Pool 内では Username が PRIMARY KEY

ユーザーを登録 (Sign-Up) する際に Username を指定します。この Username は 1つの User Pool 内でユニークである必要があります。あとから変更することもできません。

一意制約を設けたい場合は Triggers

Attributes には Email アドレスや nickname などさまざまなユーザーの属性情報を登録できます。プリセットの他に独自の Attirbute を追加できます。このとき、Required にすることはできるが一意制約はかけられないようです。同一 Email アドレスでも、登録時の Username が異なれば別ユーザーとして登録されます。

Email アドレスや nickname など、特定の Attribute に対して、一意制約をかけたり文字列種類などの制限をかけたい場合、Triggers の機能を使用します。Triggers では 認証前、認証後、などの各ポイントに対して AWS Lambda Function を設定できるので、Lamdba Function を通じて Validation の処理を行います。例えば Email アドレスが既存かどうかは ListUsers API を利用して検査すればよいようです。

MFA は メールまたは SMS に対して 認証コードが送信される

MFA は メールまたは SMS に対して認証コードが送信される方式です。よくある QR コードをアプリで読み込んでから利用する TOTP 方式ではないです。

メールの送信元は no-reply@verificationemail.com

各種メールの送信元は no-reply@verificationemail.com です。(しかしこのドメインよく取りましたね。昔から持ってたんでしょうか)

Sign-Up のためのサンプルコード(Go lang)

AWS SDK GO を使った Go lang による Sing-Up のサンプルコードを以下に示します。

package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/cognitoidentityprovider"
)

func main() {

	svc := cognitoidentityprovider.New(session.New(), &aws.Config{Region: aws.String("us-east-1")})

	params := &cognitoidentityprovider.SignUpInput{
		ClientId:   aws.String("yourAppClientID"),
		Password:   aws.String("yourNewPassword"),
		Username:   aws.String("yourUserID"),
		UserAttributes: []*cognitoidentityprovider.AttributeType{
			{
				Name:  aws.String("email"),
				Value: aws.String("ham-egg@example.com"),
			},
			{
				Name:  aws.String("nickname"),
				Value: aws.String("itakahiro"),
			},
		},
	}
	resp, err := svc.SignUp(params)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println(resp)
}

ということでおおまかな仕様については把握できました。まだ Public β の段階ですが、今後の採用を検討してもよいかと思います。

要調査項目

  • Attributes の Alias の意味と効果について
  • Go SDK での Sign-In の方法がわかってない(←
  • Email の送信元の変更(Lambda でやればよさそう)