【新機能】Amazon CognitoにTwitter認証、Digits認証が増えました

この記事は公開されてから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を設定します。

cognitoontwitter1

なんと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を使うのがベストプラクティスとなりそうですね。

参考サイト