如何在Android中存储和检索AWS Cognito JWT令牌

时间:2017-07-12 01:20:27

标签: android amazon-web-services android-asynctask amazon-cognito aws-cognito

我的Android应用在AsyncTask中使用Cognito进行身份验证,并在CognitoUserSession中接收JWT令牌。然后使用CognitoCachingCredentialsProvidersetLogins()中设置此项。

我想在另一个AsyncTask中检索此JWT令牌。但是getLogins()上的CognitoCachingCredentialsProvider返回的是0号地图。

获取令牌的最简单方法是什么?我应该再次将它存储在共享首选项中吗?

3 个答案:

答案 0 :(得分:1)

SDK中的Get / SetLogins只是更新凭证提供程序内的地图,它们不会长期保存。如果您需要在某个任意时间跨线程访问它,那将是一种合理的方法来实现它。否则,只需使用完全相同的凭证提供程序即可。

答案 1 :(得分:0)

CognitoCachingCredentialsProvider实际上是使用共享首选项来保存数据,但getLogins返回的是0号哈希值。

持久化数据(JWT)的简便方法是AsyncTask doInBackgraound方法中的共享首选项,并在需要的任何位置进行检索。

答案 2 :(得分:0)

可以在登录时从aws获取这些令牌(刷新令牌/访问令牌/ id令牌),并按如下所示设置优先级:

 final AuthenticationHandler authenticationCallBackManager = new AuthenticationHandler() {
        @Override
        public void onSuccess(CognitoUserSession userSession, CognitoDevice newDevice) {
            /*SharedPreferenceCacheManager.writeString(
                    LoginActivity.this,
                    "ACCESS_TOKEN",
                    userSession.getAccessToken().getJWTToken());*/
            //System.out.println(userSession.getAccessToken().getJWTToken());//<<-------access token

            /*SharedPreferenceCacheManager.writeString(
                    LoginActivity.this,
                    "REFRESH_TOKEN",
                    userSession.getRefreshToken().getToken());*/
            //System.out.println(userSession.getRefreshToken().getToken());//<<---------refresh token

            SharedPreferenceCacheManager.writeString(
                    LoginActivity.this,
                    "ID_TOKEN",
                    userSession.getIdToken().getJWTToken());
            //System.out.println(userSession.getIdToken().getJWTToken());//<<-----------id token(this id uses Authorization in aws-side)

            //....
        }

        @Override
        public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) {
            AuthenticationDetails authenticationDetails = new AuthenticationDetails(
                    userId,
                    String.valueOf(editTextPassword.getText()), null);

            //System.out.println(CognitoServiceConstants.AUTH_PARAM_USERNAME);
            //System.out.println(CognitoServiceConstants.AUTH_PARAM_REFRESH_TOKEN);

            // Pass the user sign-in credentials to the continuation
            authenticationContinuation.setAuthenticationDetails(authenticationDetails);

            // Allow the sign-in to continue
            authenticationContinuation.continueTask();
        }

        @Override
        public void getMFACode(MultiFactorAuthenticationContinuation continuation) {
           //....
        }

        @Override
        public void authenticationChallenge(ChallengeContinuation continuation) {
           //....
        }

        @Override
        public void onFailure(Exception exception) {
           //....
        }
    };