如何将 facebook 用户添加到 aws cognito? - android

How to add facebook user to aws cognito? - android

我有点困惑。我能够使用 facebook sdk 设置 Facebook 登录按钮。接下来,我想将用户添加到 cognito 中,但指南告诉我这样做:

Map<String, String> logins = new HashMap<String, String>();
logins.put("graph.facebook.com", AccessToken.getCurrentAccessToken().getToken());
credentialsProvider.setLogins(logins);

我做到了,我没有看到用户隐身。我很困惑,"federated authentication" 是什么意思?我想要完成的是:

1.User 通过 Facebook 注册 2.Oncefacebook登录成功,我想将该用户加入认知

这是我当前的代码:

    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)
        {

        }
    }

所以我有点困惑,Facebook 登录按钮后的下一步是什么 returns 你是用户和他们的名字、姓氏、电子邮件等。我想将该用户添加到 Cognito 中,然后得到确认。

希望有人能用正确的步骤和代码来澄清。

干杯

这取决于您使用的 Android 版本的 AWS SDK。 2.6.0 中引入了适用于 Android 的 AWS Auth SDK。

  1. 将以下代码段添加到 AndroidManifest.xml
    <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" />
  1. 在gradle中导入以下依赖项。
        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; }
  1. 执行以下导入:
    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/>                                                                            
  1. 在 strings.xml
  2. 中添加您的 FB App ID
<string name="facebook_app_id">1231231231232123123</string>
<string name="fb_login_protocol_scheme">fb1231231231232123123</string>
  1. 在 Application.java
  2. 中注册 Facebook SignInProvider
    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");

             // . . .

            }
  1. 管理 SignInUI
    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();
    }