最近公司做项目,需要用到 Amazon Cognito 的身份池来管理用户信息,记录一下 Amazon Cognito 在使用的时候遇到的问题和使用方法。

官方demo:https://github.com/awslabs/aws-sdk-android-samples

准备

需要在build.gradle中添加:

compile 'com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.6.20'
compile 'com.amazonaws:aws-android-sdk-core:2.6.20'
compile 'com.amazonaws:aws-android-sdk-iot:2.6.20'
compile 'com.amazonaws:aws-android-sdk-cognito:2.6.20'
compile 'com.amazonaws:aws-android-sdk-s3:2.6.20'

AndroidManifest.xml中也需要添加相应权限,就不多说了。

官方demo中Helper类:AppHelper.java

在登录时候就需要使用这个类。

首先要在这个配置自己身份池信息:

    /**
     * Add your pool id here
     */
    public static final String userPoolId = "xxxxxxx";
    /**
     * Add your Identity Pool ID
     */
    public static final String identityPoolId = "xxxxxxxxxx";

    /**
     * Add you app id
     */
    private static final String clientId = "xxxxxxxxxxxx";

    /**
     * App secret associated with your app id - if the App id does not have an 
     * associated App secret,
     * set the App secret to null.
     * e.g. clientSecret = null;
     */
    private static final String clientSecret = null;

配置完成之后就可以使用了。

登录

登录就是使用dfsdfsdf中方法就可以:

AppHelper.getPool().getUser(username).getSessionInBackground(authenticationHandler)

上面这句代码是kotlin写的,因为项目就是用kotlin写的,但是官方demo使用java写的,所以没有将官方demo中的java代码改成kotlin。

username就是用户名,那么authenticationHandler是什么?

就是获取身份认证的回调:

var authenticationHandler: AuthenticationHandler = object : AuthenticationHandler {
        override fun onSuccess(cognitoUserSession: CognitoUserSession?, p1: CognitoDevice?) {
            //登录成功回调
            var jwtToken = cognitoUserSession?.idToken?.jwtToken
            AppHelper.getPool().currentUser.getDetailsInBackground(detailsHandler)
        }

        override fun onFailure(p0: Exception?) {
            //获取用户失败回调
        }

        override fun getAuthenticationDetails(authenticationContinuation: AuthenticationContinuation?, p1: String?) {
            //获取用户信息成功回调
            getUserAuthentication(authenticationContinuation, username)
        }

        override fun authenticationChallenge(p0: ChallengeContinuation?) {

        }

        override fun getMFACode(p0: MultiFactorAuthenticationContinuation?) {

        }
    }

注意到override方法中的注释了吧,所以成功之后并不是直接回调的onSuccess,而是回调的getAuthenticationDetails,那为什么要回调这个方法呢?想一想,我们自己在做登录操作的时候,是要输入用户名和密码的,在上面这些代码中并没有用到密码,getAuthenticationDetails回调只是服务器中有你这个用户了(username唯一),那么现在就才开始登录(使用密码)。

getUserAuthentication方法如下:

private fun getUserAuthentication(continuation: AuthenticationContinuation?, username: String?) {
        if (username != null) {
            AppHelper.setUser(username)
        }
        val authenticationDetails = AuthenticationDetails(this.username, password, null)
        continuation?.setAuthenticationDetails(authenticationDetails)
        continuation?.continueTask()

    }

登录成功后就会回调authenticationHandler中的onSuccess方法,并获得jwtToken,就算登录成功了。

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐