I am a bit confused. I was able to set up Facebook login button using facebook sdk. Next, I wanted to add the user into cognito, but the guide told me to do this:
Map<String, String> logins = new HashMap<String, String>();
logins.put("graph.facebook.com", AccessToken.getCurrentAccessToken().getToken());
credentialsProvider.setLogins(logins);
I did that, and I don't see the user incognito. I'm confused, what does "federated authentication" mean? What I'm trying to accomplish is:
1.User registers via Facebook 2.Once the facebook login is success, I want to add that user into cognition.
This is my current code:
private void setFacebookButton()
{
Log.d("MY_FACEBOOK","setting up callbackManager");
callbackManager = CallbackManager.Factory.create();
loginButton.setReadPermissions("user_friends");
loginButton.setReadPermissions("public_profile");
loginButton.setReadPermissions("email");
loginButton.setReadPermissions("user_birthday");
// If using in a fragment
loginButton.setFragment(this);
// Callback registration
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d("MY_FACEBOOK","login success!");
Map<String, String> logins = new HashMap<String, String>();
logins.put("graph.facebook.com", AccessToken.getCurrentAccessToken().getToken());
SetLoginsAsyncTask loginsAsyncTask = new SetLoginsAsyncTask(logins);
loginsAsyncTask.execute();
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
}
public class SetLoginsAsyncTask extends AsyncTask<Void,Void,Void>
{
private Map<String,String> logins = new HashMap<>();
public SetLoginsAsyncTask(Map<String,String> logins)
{
this.logins = logins;
}
@Override
protected Void doInBackground(Void... params)
{
myCognito.getCredentialsProvider().setLogins(logins);
myCognito.getCredentialsProvider().refresh();
String testing = myCognito.getCredentialsProvider().getCredentials().getSessionToken();
if(testing != null)
{
Log.d("MY_FACEBOOK","testing is " + testing);
}
else
{
Log.d("MY_FACEBOOK","testing is null");
}
return null;
}
@Override
public void onPostExecute(Void var)
{
}
}
So I'm a bit confused, what the next steps are after the facebook login button returns you the user and their firstName, LastName, email, etc. I want to add that user into Cognito and be confirmed.
Hope someone can clarify with proper steps and code.
Cheers
It depends on the AWS SDK for Android version you are using. AWS Auth SDK for Android was introduced in 2.6.0.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"
<!-- . . . -->
<activity
android:name="com.facebook.FacebookActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />
compile 'com.android.support:support-v4:24.+'
compile ('com.amazonaws:aws-android-sdk-auth-facebook:2.6.+@aar') { transitive = true; }
// Dependencies for the SDK Sign-in prompt UI library
compile 'com.android.support:appcompat-v7:24.+'
compile ('com.amazonaws:aws-android-sdk-auth-ui:2.6.+@aar') { transitive = true; }
import com.amazonaws.mobile.config.AWSConfiguration; <br/>
import com.amazonaws.mobile.auth.core.IdentityManager; <br/>
import com.amazonaws.mobile.auth.facebook.FacebookSignInProvider; ; <br/>
import com.amazonaws.mobile.auth.core.IdentityManager;<br/>
import com.amazonaws.mobile.auth.ui.AuthUIConfiguration;<br/>
import com.amazonaws.mobile.auth.ui.SignInActivity;<br/>
import com.amazonaws.mobile.auth.facebook.FacebookButton;<br/>
import com.amazonaws.mobile.auth.core.DefaultSignInResultHandler;<br/>
<string name="facebook_app_id">1231231231232123123</string> <string name="fb_login_protocol_scheme">fb1231231231232123123</string>
private void initializeApplication() {
AWSConfiguration awsConfiguration = new AWSConfiguration(getApplicationContext());
// If IdentityManager is not created, create it
if (IdentityManager.getDefaultIdentityManager() == null) {
IdentityManager identityManager =
new IdentityManager(getApplicationContext(), awsConfiguration);
IdentityManager.setDefaultIdentityManager(identityManager);
}
// Add Facebook as Identity Provider.
IdentityManager.getDefaultIdentityManager().addSignInProvider(
FacebookSignInProvider.class);
FacebookSignInProvider.setPermissions("public_profile");
// . . .
}
import com.amazonaws.mobile.auth.core.DefaultSignInResultHandler;<br/>
import com.amazonaws.mobile.auth.core.IdentityManager;<br/>
import com.amazonaws.mobile.auth.core.IdentityProvider;<br/>
import com.amazonaws.mobile.auth.core.StartupAuthErrorDetails;<br/>
import com.amazonaws.mobile.auth.core.StartupAuthResult;<br/>
import com.amazonaws.mobile.auth.core.StartupAuthResultHandler;<br/>
import com.amazonaws.mobile.auth.core.signin.AuthException;<br/>
import com.amazonaws.mobile.auth.ui.AuthUIConfiguration;<br/>
import com.amazonaws.mobile.auth.ui.SignInActivity;<br/>
@Override<br/>
protected void onCreate(Bundle savedInstanceState) {<br/>
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
final IdentityManager identityManager =
IdentityManager.getDefaultIdentityManager();
identityManager.doStartupAuth(this,
new StartupAuthResultHandler() {
@Override
public void onComplete(final StartupAuthResult authResults) {
if (authResults.isUserSignedIn()) {
final IdentityProvider provider =
identityManager.getCurrentIdentityProvider();
// If the user was signed in previously with a provider,
// indicate that to them with a toast.
Toast.makeText(
SplashActivity.this, String.format("Signed in with %s",
provider.getDisplayName()), Toast.LENGTH_LONG).show();
callingActivity.startActivity(new Intent(SplashActivity.this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));<br/>
callingActivity.finish();
return;
} else {
// Either the user has never signed in with a provider before
// or refresh failed with a previously signed in provider.
// Optionally, you may want to check if refresh
// failed for the previously signed in provider.
final StartupAuthErrorDetails errors =
authResults.getErrorDetails();
if (errors.didErrorOccurRefreshingProvider()) {
final AuthException providerAuthException =
errors.getProviderRefreshException();
// Credentials for previously signed-in provider could not be refreshed
// The identity provider name is available here using:
// providerAuthException.getProvider().getDisplayName()
}
doSignIn(IdentityManager.getDefaultIdentityManager());
return;
}
}
}, 2000);
}
private void doSignIn(final IdentityManager identityManager) {
identityManager.setUpToAuthenticate(
SplashActivity.this, new DefaultSignInResultHandler() {
@Override
public void onSuccess(Activity activity, IdentityProvider identityProvider) {
if (identityProvider != null) {
// Sign-in succeeded
// The identity provider name is available here using:
// identityProvider.getDisplayName()
}
// On Success of SignIn go to your startup activity
activity.startActivity(new Intent(activity, MainActivity.class)
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
}
@Override
public boolean onCancel(Activity activity) {
// Return false to prevent the user from dismissing
// the sign in screen by pressing back button.
// Return true to allow this.
return false;
}
});
AuthUIConfiguration config =
new AuthUIConfiguration.Builder()
.signInButton(FacebookButton.class)
// .signInButton(GoogleButton.class)
// .userPools(true)
.build();
Context context = SplashActivity.this;
SignInActivity.startSignInActivity(context, config);
SplashActivity.this.finish();
}