Front-End Web & Mobile
Announcing Twitter and Digits Support for Amazon Cognito
When Amazon Cognito was first launched, we included support for Facebook, Google, Login with Amazon, as well as unauthenticated identities.
In response to customer requests, we added OpenID Connect support as well as developer authenticated identities to enable developers to extend Amazon Cognito to support any aribitrary provider. Even though it was possible to add support for any provider, many customers continued to ask for native support for Twitter authentication without the overhead of a managed backend.
Today, we are excited to announce native support in Amazon Cognito for not only Twitter authentication, but also Digits authentication provided by Twitter’s Fabric platform. Amazon Cognito’s support for Digits enables developers to provide the simplest onboarding flow for their users. Users login with only their phone number to receive a code via SMS and never have to worry about entering a username/password.
This post will cover how you can configure Twitter/Digits login for Amazon Cognito to authenticate your users.
Configuring Your Identity Pool for Twitter/Digits
Twitter/Digits will appear as a tab in the Authentication providers section in the Amazon Cognito console when creating a new identity pool or editing an existing pool.
You will need to enter two pieces of information in the console to configure Twitter and Digits support:
- Consumer Key
- Consumer Secret
These values are available from the Fabric console after you have integrated Fabric into your application.
After you add these values in the identity pool configuration, you are ready to start authenticating users via Twitter and Digits.
Authenticating users with Twitter
Using the TwitterKit SDK login functionality, we need to simply capture the result of the completion handler and pass the appropriate fields to Amazon Cognito.
Twitter sessions contain two important values:
- User token
- User secret
Amazon Cognito expects these values to be passed in a single value in logins with the key api.twitter.com
, concatenated with a single semicolon (;
) delimeter.
iOS
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 } });
Authenticating users with Digits
Digits support is handled through a separate call in the Fabric SDK, but the session returned is essentially the same as with Twitter login. You just need to concatenate the values from the session using a single semicolon (;
) delimiter and store in logins with the key of www.digits.com
.
iOS
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
DigitsAuthButton digitsButton = (DigitsAuthButton) findViewById(R.id.auth_button);
digitsButton.setCallback(new AuthCallback() {
@Override
public void success(DigitsSession session,
String phoneNumber) {
TwitterAuthToken authToken = (TwitterAuthToken)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
}
});
Conclusions
As you can see, adding Twitter and Digits support is quite simple once you integrate the necessary SDKs in your application.
We encourage you to try out this new support and let us know what you think of this new feature by leaving a comment below, or by posting on our forums or StackOverflow if you encounter any issues.