AWS Cognito:处理令牌过期时间

Posted

技术标签:

【中文标题】AWS Cognito:处理令牌过期时间【英文标题】:AWS Cognito: dealing with token expiration time 【发布时间】:2016-05-19 16:01:32 【问题描述】:

我正在尝试 Cognito,当我认为它开始没问题时,我遇到了(Google)令牌在 1 小时后过期的问题。

当我开始使用干净的设备时,我可以注册,使用该应用程序 1 小时,然后当我需要刷新数据集时,我收到并错误提示令牌未经授权。

有没有例子说明如何处理这个问题?

这真的是应用程序开发人员应该做的事情吗? 我期待 SDK 在后台管理这些事情。

是不是说每次数据同步前都要检查credentialsProvider.getSessionCredentitalsExpiration()?

非常感谢, 杰米

编辑 1:添加代码

我确实有一个 SigninActivity,但仅在根本不存在凭据时才调用它,理论上仅在用户第一次登录时调用一次。

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

但一定有办法静默刷新这个令牌?

@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);
    

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗨 Rachit,感谢您的回答,我已经编辑了我的问题并添加了我的代码。一般来说,一个关于如何处理令牌刷新和通常“发布错误”的示例(用户确实撤销了身份验证,这种事情)真的很有帮助。 所以刷新谷歌令牌取决于个人喜好,我们已经看到开发人员按照***.com/questions/18572088/… 的方式做一些事情。话虽如此,我们已经听到客户要求提供帮助方法来刷新令牌,我们将考虑在未来的版本中添加这些方法。 Rachit,我只能支持这个要求。我没有对你动手,但是这不是开箱即用的管理,这非常令人失望。除非我感到困惑,否则这听起来像是一个非常基本的要求,SDK 应该处理一些事情,以便让我们专注于我们的附加值。 我们也从其他客户那里听到了这个要求,并将考虑在未来的服务更新中添加这个功能。一如既往,如果您有任何问题,请随时在我们的论坛或此处发帖。 令我困惑的是,我能够重现 Cognito 自行处理此问题的情况(请参阅此处github.com/ironbird-software/aws-cognito-sync-issues)。所以我不明白为什么开发人员有责任,如果 SDK 始终如一地处理它,对我们所有人来说会更简单。

以上是关于AWS Cognito:处理令牌过期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Cognito 上的令牌过期问题

如何修改 AWS Cognito 用户池的访问令牌和身份令牌的到期时间

Grpc令牌过期处理

如何从 Cognito 获取 Apple 刷新令牌?

Django - 在处理终端节点请求之前验证 AWS Cognito 令牌是不是有效

在 Laravel 中处理过期令牌