ラベル AWS の投稿を表示しています。 すべての投稿を表示
ラベル AWS の投稿を表示しています。 すべての投稿を表示

2017年8月14日月曜日

IonicとAWS CognitoとFacebook認証連携(前編)

プログラミングの話です。興味ない人は読まないほうがいいです(笑)

Ionicを使って携帯アプリを色々と開発しておりますが、いつも認証周りは鬼門なのでここらで一発AWS Cognitoを活用してみようと思い数日間試行錯誤しておりました。実現したいのは

  • アプリケーションへのログインにFacebook認証を使う
  • 認証済ユーザにはAmazon Web Serviceのリソースへのアクセス権を一時的に与える
  • 携帯側はIonicで開発
この3点です。

ちょっと前(といっても一昨年くらいか)までは、このような場合にはCordovaのInApp Browserで認証させて、http://localhostにコールバックかましてトークンを取り出して、なんていうのが定番でしたが、もうそんな時代じゃないのですね。
じゃあどうするのよ、って調べるとどうやら@ionic-native/facebookというのを使えば良い模様。あとは@ionic-native/facebookとAWS Cognitoを連携させるだけですね。楽勝でしょこんなの。(注: 楽勝=StackoverflowやQiitaもしくはGithubの事例を参考にすれば出来上がり)

ところが...

意外にもこの組み合わせを試した事例が少ない。そもそもAmazonのドキュメントを漁ってもCognito User PoolにおけるFederation Identity Providerと、Cognito Identity PoolにおけるAuthentication Providerの役割を明確にしたものが見当たらず、色々と試行錯誤の連続でありました。最も参考になったのはaws-cognito-ionic2というプロジェクトでしたが、おそらくこの作者もFacebookやTwitterの認証連携は実装していないと思われます。(このCloseされたIssueでそう推察しました。だってIt's just a matter of adding additional buttons and some code では実装できないから)

今回頭を悩ませたのは以下の問題です。
  • Cognito User Poolは「User ID」「Password」が必須であり、オプションでEmail等も管理できる。
  • Federated Loginが返してくる情報には「User ID」に使えそうなものはあるが、Passwordはついてくるはずないし、Emailももらえないのが普通。(嘘だと思ったらTwitterやFacebookのOauth戻り値を見よ)
  • かような状況で、Federated Loginの結果からCognito Userを生成できるのか?
実際に悩んでいる人はいるようで、Facebook認証はうまくいくのにgetCurrentUser()がNullを返すという質問がStackoverflowに上がってました。これに対する回答は「お前は何を言ってるんだ?」的な内容で、思わず▼ボタンをクリックしましたが私にはカルマが足りないのでマイナス評価を付けることはできませんでした。

私が出した結論は(間違ってるかもしれませんが)「Federated Loginの結果、User Poolに新規ユーザレコードが生成されることはない」です。Cognitoの設定画面にはAttribute Mappingの設定もあり、いかにもFederated LoginからUser Poolにシームレス連携()ができるような雰囲気が醸し出されてますが、これは罠です。きっとそうです。違う!という人は是非ご指摘をお願いします。

あ~話が長くなりました。年取るとこれだからダメですよね。

ということで、今回は@ionic-native/facebookを使って認証する部分までの実験結果です。ソースは小生の作りかけばかりのGithubに入ってます。Tag=MVP2からダウンロードするなりForkするなりしてください。

以下、設定でのメモ。

Facebookアプリの設定
  • AndroidとiOSの両方を設定すること
  • その際、Ionicアプリのconfig.xmlにあるバンドルIDをFacebook側に登録しておくこと
  • 要は@ionic-native/facebookのインストール方法に従うこと
  • Android用設定でkeytoolコマンドを使う場面がありますが、これはJava SDKについてくるコマンドです。
  • OAuth Callbackは今の時点では適当に設定しておいて大丈夫です
AWS Cognitoの設定
  • 後編で設定します


IonicのsidemenuにFacebook認証ボタンを付けただけですが、まずはLogin/Logoutできるようになりました。後編ではAWS Cognito(のIdentity Pool)との連携について書きます。


2011年9月18日日曜日

python+botoとSimpleDBで手抜き開発

コツコツとGoogle App Engine上でアプリケーションを開発していたのだが、最近の料金変更を機会に方針を変更することに決めた。要はAmazon Web Service移行である。

で、データベース。GoogleはDatastoreを提供していたが、Amazonは幾つかの選択肢がある。

  • RDS(MySQL)
  • EC2にMySQL
  • SimpleDB
RDSは個人で使うにはちょっと豪華すぎる。今さらMySQLを設置保守するのも面倒。残るはSimpleDBでAmazonの説明によれば
You can get started with Amazon SimpleDB for free. New and existing customers receive 25 SimpleDB Machine Hours and 1 GB of Storage for free each month. Many applications should be able to operate perpetually within these free tier limits.
ということなので、よほど無茶な使い方をしなければ無料で行けそうだ。となるとあとはアプリケーションからの操作だが、これはbotoを使えばなんとかなろう。ただし説明書は絶望的なくらい揃っていない。ソースを読むしかない。以下、メモ。

boto.sdb.db.Modelを継承すれば永続化は簡単。
from boto.sdb.db.model import Model
from boto.sdb.db.property import *

class QuoteModel(Model):
    ticker = StringProperty()
    dt = DateTimeProperty()
    op = FloatProperty()

q = QuoteModel()
q.ticker = "ABC"
q.dt = some_date
q.op = 1.23
q.put()

boto.sdb.db.Queryを使って検索。

from boto.sdb.db.query import Query

query = Query(QuoteModel)
query.order('dt')
q = query.filter('ticker =', ticker)
q = query.filter('dt >=', some_date1)
q = query.filter('dt < ', some_date2)

for r in q:
    #dt順にならんだQuoteModelに対する操作が可能
botoの設定は/etc/boto.cfgにいれておけばよい。あとはPylonsでも組み合わせればいいんですかね。

2011年6月21日火曜日

AWS Summit 2011 San Francisco

AWS Summit 2011に行ってきた。会場はSan Francisco Union Square隣のWestin。去年までの会場と比べると、Amazonクラウドも成長したもんだな〜と感慨ひとしお。午後は3セッション並走で、その分各コマが丁寧になったが、一社から3人出向かないと全部をつかめなくなった、というのも事実。まあ、それだけAmazonクラウドはでかくなっているということで。

会場で配っていた「Cloud Passport」。USBメモリが内蔵されている。こんな感じ。
これを挿すと、各セッションの発表資料を表示できる、というわけ。Buzzcardという会社が作っているらしい。この手の催事のお土産にいいかも。