この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、せーのです。今日はモバイル系で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を使うのがベストプラクティスとなりそうですね。