【问题标题】:How to add facebook user to aws cognito? - android如何将 facebook 用户添加到 aws cognito? - 安卓
【发布时间】:2017-09-28 04:58:01
【问题描述】:

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

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

我这样做了,但我没有看到用户隐身。我很困惑,“联合身份验证”是什么意思?我想要完成的是:

1.用户通过Facebook注册 2.一旦facebook登录成功,我想将该用户添加到认知中。

这是我当前的代码:

    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 登录按钮返回用户及其名字、姓氏、电子邮件等之后,接下来的步骤是什么。我想将该用户添加到 Cognito 并得到确认。

希望有人可以通过正确的步骤和代码进行澄清。

干杯

【问题讨论】:

  • 嗨,你最后做了什么?

标签: android facebook amazon-web-services aws-sdk federated-identity


【解决方案1】:

这取决于您使用的适用于 Android 的 AWS 开发工具包版本。适用于 Android 的 AWS Auth SDK 是在 2.6.0 中引入的。

  1. 将以下 sn-p 添加到 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 中添加您的 FB 应用 ID
<string name="facebook_app_id">1231231231232123123</string>
<string name="fb_login_protocol_scheme">fb1231231231232123123</string>
  1. 在 Application.java 中注册 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. 管理登录用户界面
    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();
    }

【讨论】:

  • 不添加到用户池中。你有什么解决办法吗?
  • 你能详细说明你的问题吗?
  • 我现在收到此错误:原因:com.amazonaws.AmazonServiceException:检测到 1 个验证错误:“identityPoolId”处的值“us-east-1_xxxxxxxxxx”未能满足约束:成员必须满足正则表达式模式:[\w-]+:[0-9a-f-]+(服务:AmazonCognitoIdentity;状态代码:400;错误代码:ValidationException;请求ID:xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx)
  • 请指导我这是什么问题?
  • @JayNirmal IdentityPoolId 和 userPoolId 是两个不同的东西。您需要 IdentityPoolId ,它位于管理池身份部分,也称为联合身份
猜你喜欢
  • 2019-09-13
  • 2017-05-30
  • 2019-11-29
  • 2018-09-08
  • 2018-12-11
  • 2020-02-25
  • 2017-09-22
  • 2018-06-02
  • 2020-05-02
相关资源
最近更新 更多