組み込みメーカーだからこ
その
AWS Cognitoの使い
方
AWS 標準機能をいかに拡張し
マネージドサービスオンリーで認証基盤を
実現するか
自己紹介
• 上田 渉太
• アルパイン株式会社イノベーションラボ所属
• 企画、設計職
• 趣味
• ロードバイク
• ゲーム作り (主にコアワーキングスペース weeyble https://weeyble.com/ で活動しています)
• 3D CG (無印Zbrushで作品を作っています)
• Twitter( @tukkyCG1 )
• Qiita( https://qiita.com/tukkyr )
• Slideshare( https://www.slideshare.net/shotaueda3 )
• 好きなAWSのサービス
• Lambda
• DynamoDB
• AppAync
アルパインの紹介
社名
アルパイン株式会社
設立
1967年5月
東京本社
東京都大田区雪谷大塚町1-7
資本金
259億円
従業員数
13,175名(2018年3月31日現在)
グループ
海外15か国28社・国内7社
1500
2250
3000
2017/32018/32019/3
売上(億円)
2,477 2,752
2,950
(予想)
0
50
100
150
200
2017/3 2018/3 2019/3
営業利益(億円)
56
137
130
(予想)
主要製品
市販市場向け
オーディオ・カーナビシステム
自動車メーカー向け
車載システム
コネクテッドサービス領域へ
オープンイノベーション推進!
アジェンダ
• 実現したいこと
• 組み込みメーカーならではの事情
• ユーザー認証に求める要件
• AWSの認証サービスの紹介
• AWSの認証サービスを使う上での問題点
• 解決方法の提示
• まとめ
AWS マネージドサービスのみで
認証基盤を構築したい
• 皆さんもAWSのマネージドサービスを調べて自社サービスの適
応を考えた際、あと少し機能の拡張やカスタマイズが出来れば
と考えたことはありませんか
• 本LTでは私が実際に遭遇した 組み込みメーカーならではの
事情を認証基盤に組み込んだ時
• いかにして AWSのマネージドサービスを拡張して問題を解決
したか紹介したいと思います
システムの概要と特徴
• 開発対象が組み込み機器とスマホアプリの二
か所
• スマホアプリのみが直接AWSのサービスとつな
がり、組み込み機器はスマホアプリを経由しな
いとAWSのサービスを利用できない
• ユーザー認証に関わる部分はAWSの
CognitoとApiGatewayを使ってマネージド
なAWSのサービスのみで構築したい
Mobile client
AWS
account
シリアルナ
ンバー
組み込み機器
②ユーザー登録
③IDTOKEN
(Cognito署名付き)
④CognitoUserPool
で認証・認可
①
組み込み機器メーカーならではの事情1
• 組み込み機器とスマホアプリの両方の開発が必要になり、それらの寿命とリリー
ス回数が異なる
• 組み込み機器が新しく購入された場合
• スマホアプリに新しい機器購入されたことを通知し同一ユーザーとしてサービ
スを継続したい
• アプリサービスが新しくリリースされた場合
• 既存の組み込み機器を使用しているユーザーを同一人物として認識した上
で新しいスマホアプリのサービスを提供したい
組み込み機器メーカーならではの事情2
• 組み込み機器自体はAWSとの通信手段を持たず
スマホアプリがその役割を肩代わりする
• 実際にユーザー認証の仕組みを持つのはスマホアプリで組み込み機器の区別する情
報はシリアルナンバーのみである
• スマホアプリが変わると同じ組み込み機器を使っていてもユーザーの認証情報を一切引
継ぎできなくなってしまう
• シリアルナンバーを登録するタイミングとAWSで認証を行うタイミングが異なる
• スマホアプリ間で組み込み機器のシリアルナンバーを共有できる仕組みが必要
ユーザー認証に求める要件
• 組み込み機器、スマホアプリのどちらか一方が新しくなっても、
もう一方に与える影響を最小限としたい
• シリアルナンバーをスマホアプリ間で共有したい
• 組み込み機器やスマホアプリとは独立したユーザー毎の情報(セッションID)が作成できなおかつ、
それをスマホアプリ間で共有できれば良い
• シリアルナンバーはセッションIDに紐づけていつでも保管できる
AWSの認証に関わる
マネージドサービスについて
• AWS Cognito Userpool
• AWSが提供するモバイル用のクラウド認証サービス
• 実態はOpenID ConnectのIDプロバイダーのラッパーのようなもの
• クライアントからの認証情報に基づいて、IDTokenをCognitoの署名付きで発行する
• ユーザーの認証情報を管理する機能をもつ、しかし標準機能ではUserpool間でユー
ザーの認証情報の受け渡しはできない
• AWS ApiGateway
• 簡単にWebapiを作成、配布、保守、監視、保護を行うことが出来る
• オーサライザーを設定することで、Apiのアクセスを制御することもできる
システムの概要 お試し版
- AWSを使ってマネージドなシステムを組んでみる
① 組み込み機器はシリアルナンバーをスマホアプ
リに伝える
② スマホアプリはCognitoにユーザー認証の情
報を送る
③ Cognitoは情報をもとに署名し,IDTokenと
してスマホアプリに返す
④ スマホアプリはIDTokeをApiGatewayに送
る。
ApiGatewayはIDTokenの署名をチェックし
、各サービスに対してリクエストを転送する Mobile client
AWS
account
シリアルナ
ンバー
組み込み機器
②ユーザー登録
③IDTOKEN
(Cognito署名付き)
④CognitoUserPool
で認証・認可
①
システムの問題
- ユーザー認証に求める要件と比較して
• ユーザーを認証したタイミングでセッションIDが作成できない
• スマホアプリに対して、Userpoolを一つづつ割り当てると
アプリ間でユーザー情報を共有する手段がない
• シリアルナンバーがユーザー登録のタイミングでしか送れない
• ユーザー認証としの基本的な機能はあるのにこのまま諦め
るのはもったいない
• どうにかして機能を拡張できないか
Lambdaを使えば
機能を拡張できます!!
Mobile
client
AWS
account
シリアルナ
ンバー
組み込み
機器
②ユーザー登録
③IDTOKEN
(Cognito署名付き)
④CognitoUserPoolで
認証・認可
①
AWS Lambdaとは
• マネージドなサービスで任意コードをサーバーを管理しなくてもコードを実行することが出来
る
• Node.js, java, Go, C#, Pythonをサポート
• IAMを設定してあげることでAWSのリソースへのアクセスの制御もできる
• ApiGatewayから呼び出して、サーバーレスのRESTApiを実現するといった用途でよく
使われる
• 実は一部のサービスでは機能の拡張のためにLambdaを利用することが出来る
• CognitoとApiGatewayはこの機能拡張の仕組みを持っている
CognitoUserpool+Lambdaで拡張する
• Lambdaトリガーを利用してワークフローをカスタマイズする
• トリガーはトークン生成前トリガーを使う
• カスタマイズすること
• Lambdaが呼び出されたら uuidを使ってセッションIDを作成する
• セッションIDとユーザーの認証情報をDBに保管する
• IDToken生成時のclaim情報にセッションIDを付加する
• これはcookieのセッションIDのようにアプリとサーバー間でのみ知っている情報として扱う
ApiGateway+Lambdaで拡張する
• Lambdaトリガーを利用してLambdaオーサライザーを作成する
• APIリクエストの署名確認はLambdaオーサライザーで行う
• カスタマイズすること
• リクエストがCognitoで署名されたIDTokenを持っているかを確認する
• IDTokenからカスタマイズしたセッションIDを含むclaimを取り出し
マッピングテンプレートで各サービスにユーザーの認証情報を渡す下準備をする
システムの概要
- 完成版 -
• ユーザーを認証したタイミングでセッション
IDが作成できない
• スマホアプリに対して、Userpoolを一つ
づつ割り当てるとアプリ間でユーザー情報
を共有する手段がない
• シリアルナンバーがユーザー登録のタイミン
グでしか送れない
解
決
元の設計をほとんど変更することなしに
要件を達成することに成功!!
変更したのは赤枠の部分だけ
Mobile client
シリアルナ
ンバー組み込み機器
①ユーザー登録
④IDTOKEN
(Cognito署名付き)
⑤IDTokenの転送
UserData
管理
account
②セッションIDの
作成とDBへの保存
③Claimに
セッション
IDを含める
ようリクエ
スト
⑥IDTOKEN
の署名確認
⑦署名結果
の通知
Contextの編集
ユーザーデータの
取得
別のAWSアカウント(別のUserPool保持)からもアクセス可能
解
決
解
決
まとめ
• 今回の例では私が実際に遭遇した問題とその解決方法でしたが、皆さんの業務に
も利用できる点があると思います
• AWSを使う上で
• 実現したいことの特徴点と問題点を洗い出してみる
• AWSの標準機能を調査し、極力マネージドサービスのみでシステムを組んでみる
• AWS標準機能で実現できたことと実現できなかったことを洗い出す
• 実現できなかったことに対して、Lambdaの拡張で実現できないか検討してみ
る
• それでもだめなら初めて、自前でサービスを作成することを検討する
このステップ
があることを
本LTで知って
いただければ
幸いです
組み込みメーカーだからこそのAWS Cognitoの使い方

組み込みメーカーだからこそのAWS Cognitoの使い方

Editor's Notes

  • #23  引き続き、この場をお借りしまして、私より、昨今の当社を 取り巻く環境と今後の取り組みについて、ご説明申し上げます。