【新機能】Amazon CognitoにTwitter認証、Digits認証が増えました
こんにちは、せーのです。今日はモバイル系でAWSを使用している方々に朗報な新機能です。
Cognitoの認証
Cognitoは色々なログインプロバイダを使ってAWSリソースを活用できるようにする、大変便利な認証サービスです。 今までCognitoがサポートしてきた認証プロバイダはAmazon / Facebook / Googleでした。それが去年の秋頃にOpenIDをサポートするようになり、間口がグッと広がりました。今回はついに待ちに待ったTwitter認証と日本では少し馴染みの薄い「Digits」という認証がサポートされました。
DIGITSとは
ここであまり耳慣れない「DIGITS」という認証方法について軽く振れておきます。DIGITSとはTwitterが開発したAPI「Fabric」の一機能で、ユーザー名やパスワードなしに電話番号のみでSMS認証を行う事ができるサービスです。国番号と電話番号を入力するとTwitterのインフラを使用してSMSにワンタイムパスコードが送られ、そちらをアプリに入力することでログインさせる、というなかなかハードルが高そうな認証方法を数行で書けてしまう、というすぐれものです。
実装方法
Cognitoの設定
では実装していきましょう。まずはマネージメントコンソールからCognitoにいき、Fabricのコンソールから取得したAPIのconsumer keyとconsumer secretを設定します。
なんとCognito側の設定はこれで終わりです。簡単ですね。次にコードを書いてみましょう。
TwitterKit SDK Loginを使う
実装の際にTwitterKit SDK Loginを使用するととても簡単に実装することができます。Twitter sessionには
- User token
- User secret
という2つの値が含まれていまして、こちらの値を";"で結んだ値をapi.twitter.comに投げることで認証が行われます。ではまずTwitterを使用した認証のコードをざっとご紹介します。
Objective-C
[[Twitter sharedInstance] logInWithCompletion:^ (TWTRSession *session, NSError *error) { if (session) { NSString value = [NSString stringWithFormat:@"%@;%@", session.authToken, session.authTokenSecret]; // Note: This overrides any existing logins credentialsProvider.logins = @{@"api.twitter.com", value}; } else { NSLog(@"error: %@", [error localizedDescription]); } }];
Swift
Twitter.sharedInstance().logInWithCompletion { (session, error) -> Void in if (session != nil) { var value = session.authToken + ";" + session.authTokenSecret // Note: This overrides any existing logins credentialsProvider.logins = ["api.twitter.com": value] } else { println("error: \(error.localizedDescription)") } }
Android
loginButton = (TwitterLoginButton) findViewById(R.id.login_button); loginButton.setCallback(new Callback<TwitterSession>() { @Override public void success(Result<TwitterSession> result) { TwitterSession session = result.data; TwitterAuthToken authToken = session.getAuthToken(); String value = authToken.token + ";" + authToken.secret; Map<String, String> logins = new HashMap<String, String>(); logins.put("api.twitter.com", value); // Note: This overrides any existing logins credentialsProvider.setLogins(logins); } @Override public void failure(TwitterException exception) { // Do something on failure } });
Digitsの実装
次にDigitsを使用した認証コードです。基本的にはTwitterと同じくセミコロンで結んでAPIに投げるのですが、DigitsのAPIはwww.digits.comとなります。
Objective-C
[[Digits sharedInstance] authenticateWithCompletion:^ (DGTSession* session, NSError *error) { if (session) { NSString value = [NSString stringWithFormat:@"%@;%@", session.authToken, session.authTokenSecret]; // Note: This overrides any existing logins credentialsProvider.logins = @{@"www.digits.com", value}; } }];
Swift
let digits = Digits.sharedInstance() digits.authenticateWithCompletion { (session, error) in if (session != nil) { var value = session.authToken + ";" + session.authTokenSecret // Note: This overrides any existing logins credentialsProvider.logins = ["www.digits.com": value] } }
Android
<code>DigitsAuthButton digitsButton = (DigitsAuthButton) findViewById(R.id.auth_button); digitsButton.setCallback(new AuthCallback() { @Override public void success(DigitsSession session, String phoneNumber) { DigitsSession session = result.data; DigitsAuthToken authToken = session.getAuthToken(); String value = authToken.token + ";" + authToken.secret; Map<String, String> logins = new HashMap<String, String>(); logins.put("www.digits.com", value); // Note: This overrides any existing logins credentialsProvider.setLogins(logins); } @Override public void failure(DigitsException exception) { // Do something on failure } });</code>
まとめ
いかがでしたでしょうか。認証がここまで簡単に書ける、という時代がやってきています。モバイルアプリを書く時はAWSを使うのがベストプラクティスとなりそうですね。