Android AWS Cognito:处理令牌过期时间

Android AWS Cognito:处理令牌过期时间,android,amazon-web-services,google-signin,amazon-cognito,Android,Amazon Web Services,Google Signin,Amazon Cognito,我正在试验Cognito,当我认为它开始正常时,我面临着(谷歌)代币在1小时后过期的问题 当我开始使用干净的设备时,我可以注册,使用应用程序1小时,然后只要我需要刷新数据集,我就会收到一条错误消息,说令牌未授权 有没有关于如何处理这个问题的例子 这真的是应用开发者应该做的事情吗? 我希望SDK能够在后台管理这些事情 这是否意味着我们必须在每次数据集同步之前检查credentialsProvider.GetSessionRedentitalSexpiration() 非常感谢,, 吉咪 编辑1:添

我正在试验Cognito,当我认为它开始正常时,我面临着(谷歌)代币在1小时后过期的问题

当我开始使用干净的设备时,我可以注册,使用应用程序1小时,然后只要我需要刷新数据集,我就会收到一条错误消息,说令牌未授权

有没有关于如何处理这个问题的例子

这真的是应用开发者应该做的事情吗? 我希望SDK能够在后台管理这些事情

这是否意味着我们必须在每次数据集同步之前检查credentialsProvider.GetSessionRedentitalSexpiration()

非常感谢,, 吉咪

编辑1:添加代码

我确实有一个显著性,但它只在根本不存在凭证时调用,理论上只在用户第一次登录时调用一次

它按如下方式构建(删除无用位)。 所以发生的事情是,我第一次就正确地进行了身份验证,但是由于我再也没有进入这个活动,可能缺少了一些东西

但是必须有一种方法来悄悄地刷新这个令牌吗

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.signin);

    // Aws Credential provider
    credentialsProvider = new CognitoCachingCredentialsProvider(
            getApplicationContext(), // Context
            getString(R.string.aws_identity_pool), // Identity Pool ID
            Regions.EU_WEST_1 // Region
    );

    // Google connect
    findViewById(R.id.signin_with_google_btn).setOnClickListener(this);

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestProfile()
            .requestIdToken(getString(R.string.google_server_client_id))
            .requestId()
            .build();

    // Build a GoogleApiClient with access to the Google Sign-In API and the
    // options specified by gso.
    googleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this, this )
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();

    SignInButton signInButton = (SignInButton) findViewById(R.id.signin_with_google_btn);
    signInButton.setSize(SignInButton.SIZE_WIDE);
    signInButton.setScopes(gso.getScopeArray());
    signInButton.setColorScheme(SignInButton.COLOR_DARK);
}

@Override
public void onClick(View view) {
    this.signinWithGoogle();
}

/**
 * Triggers Google signin
 */
private void signinWithGoogle() {
    Log.v(this, "Signing in with Google...");

    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
    this.startActivityForResult(signInIntent, GOOGLE_SIGN_IN);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == GOOGLE_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        this.handleGoogleSignInResult(result);
    } else {
        // Other stuff
    }
}


/**
 * Handle Google sign in result
 */
private void handleGoogleSignInResult(GoogleSignInResult result) {

    if (result.isSuccess()) {

        Log.v(this, "Successfully logged in with Google...");

        GoogleSignInAccount acct = result.getSignInAccount();
        Log.v(this, "Signed in as %s / %s (token %s)", acct.getDisplayName(), acct.getEmail(), acct.getIdToken());
        Map<String, String> logins = new HashMap<>();
        logins.put("accounts.google.com", acct.getIdToken());
        Log.v(SigninActivity.this, "Google token <<<\n%s\n>>>", logins.get("accounts.google.com"));
        credentialsProvider.setLogins(logins);
    } else {
        // Signed out
        Log.w(this, "Failed to authenticate against Google #%d - %s", result.getStatus().getStatusCode(), result.getStatus().getStatusMessage());

        SimpleMessageDialog.show(SigninActivity.this,
                R.drawable.icon,
                R.string.error,
                R.string.sorry_error_signing_you_in_please_try_again,
                R.string.try_again);
    }
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.setContentView(R.layout.sign);
//Aws凭据提供程序
credentialsProvider=新CognitoCachingCredentialsProvider(
getApplicationContext(),//上下文
getString(R.string.aws\u identity\u pool),//identity pool ID
Regions.EU_WEST_1//Region
);
//谷歌连接
findViewById(R.id.signin_with_google_btn)。setOnClickListener(此);
GoogleSignenOptions gso=新建GoogleSignenOptions.Builder(GoogleSignenOptions.DEFAULT\u登录)
.requestEmail()
.requestProfile()
.requestIdToken(getString(R.string.google_服务器_客户端_id))
.requestId()
.build();
//通过访问Google登录API和
//gso指定的选项。
GoogleapClient=新的GoogleapClient.Builder(此)
.enableAutoManage(这个,这个)
.addApi(Auth.GOOGLE\u SIGN\u IN\u API,gso)
.build();
SignInButton SignInButton=(SignInButton)findViewById(R.id.signin_和google_btn);
signInButton.setSize(signInButton.SIZE_宽);
设置范围(gso.getScopeArray());
signInButton.setColorScheme(signInButton.COLOR_深色);
}
@凌驾
公共void onClick(视图){
this.signinWithGoogle();
}
/**
*触发谷歌登录
*/
私有void signiWithGoogle(){
Log.v(这是“使用谷歌登录…”);
Intent signient=Auth.GoogleSignInApi.getsignient(谷歌客户端);
这是startActivityForResult(谷歌登录);
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==谷歌登录){
GoogleSignInResult结果=Auth.GoogleSignInApi.getSignInResultFromIntent(数据);
此.handleGoogleSignInResult(结果);
}否则{
//其他东西
}
}
/**
*处理谷歌登录结果
*/
私有无效handleGoogleSignInResult(Google SignInResult结果){
if(result.issucess()){
v(这是“成功登录谷歌…”);
GoogleSignInAccount acct=result.getSignInAccount();
Log.v(这是“以%s/%s(令牌%s)身份登录”、帐户getDisplayName()、帐户getEmail()、帐户getIdToken());
Map logins=new HashMap();
logins.put(“accounts.google.com”,acct.getIdToken());
Log.v(SigninActivity.this,“谷歌代币”,logins.get(“accounts.Google.com”);
credentialsProvider.setLogins(登录名);
}否则{
//注销
Log.w(这是“未能针对Google#%d-%s进行身份验证”,result.getStatus().getStatusCode(),result.getStatus().getStatusMessage());
SimpleMessageDialog.show(SigninActivity.this,
R.drawable.icon,
R.string.error,
R.string.sorry\u错误\u签名\u您输入\u请再试一次,
R.string。请重试);
}
}

您是否遵循所有记录的步骤?SDK将自动为您获取AWS凭据以交换有效令牌,但如果您的Google令牌已过期,则您需要刷新它。

嗨,Rachit,谢谢您的回答,我已编辑了我的问题并添加了代码。一般来说,一个关于如何处理令牌刷新和通常的“登录后错误”(用户确实撤销了身份验证,这类事情)的示例确实会有帮助。因此,刷新google令牌取决于个人偏好,我们已经看到开发人员按照以下方式做了一些事情。也就是说,我们已经听到客户关于提供帮助方法来刷新令牌的请求,我们将考虑在将来的版本中添加这些方法。Rachit,我只能满足这个要求。我不是在尝试你,但这是相当令人失望的,这是没有管理的开箱即用。除非我感到困惑,这听起来像是一个非常基本的要求,SDK应该处理的事情,以便让我们专注于我们的附加值。我们也听到了来自其他客户的请求,并会考虑在今后的更新中添加该功能的服务。如果您有任何问题,请随时在我们的论坛或这里发布。让我困惑的是,我能够重现Cognito自己处理这一问题的情况(参见此处)。因此,我无法理解为什么开发人员的责任在于开发人员,而如果SDK能够始终如一地处理它,那么对我们所有人来说都会简单得多。