当前位置: 首页 > 知识库问答 >
问题:

如何强制AWS Cognito从服务器检索IdentityId?

仲孙雅达
2023-03-14

在iOSSDK(v2.4.8)中,我不能注销一个用户,然后以不同的用户正确登录。

AWS为第一个用户(自应用程序启动后)返回的(正确的)cognityIdentityId也为第二个用户返回(除非应用程序重新启动)。这允许另一个用户访问一个用户的AWSCognitoDataset。

我认为这是因为iOS SDK缓存了id,而清除该缓存的记录调用无法完全工作。

登录时:

// one-off initialisation

self.credentialsProvider=AWSCognitoCredentialsProvider(regionType:AWSRegionType.USEast1,identityPoolId:Constants.CognitoIdentityPoolId)let configuration=AWSServiceConfiguration(region:AWSRegionType.USEast1,credentialsProvider:self.credentialsProvider)AWSServiceManager.defaultServiceManager().defaultServiceConfiguration=configuration…//我从外部提供程序serice(Auth0)func doAmazonLogin获取idToken(idToken:字符串,success:()-

    //Initialize clients for new idToken
    if self.credentialsProvider?.identityProvider.identityProviderManager == nil || idToken != Application.sharedInstance.retrieveIdToken() {
        let logins = [Constants.CognitoIDPUrl: idToken]
        task = self.initializeClients(logins)
    } else {
        //Use existing clients
        self.credentialsProvider?.invalidateCachedTemporaryCredentials()
        task = self.credentialsProvider?.getIdentityId()
    }
    //Make login
    task!.continueWithBlock { (task: AWSTask!) -> AnyObject! in
        if (task.error != nil) {
            failure(task.error!)
        } else {
            // the task result will contain the identity id
            let cognitoId:String? = task.result as? String
            self.customIdentityProviderManager!.addToken(Constants.CognitoIDPUrl, value:idToken)
            //Store Cognito token in keychain
            Application.sharedInstance.storeCognitoToken(cognitoId)
            success()
        }
        return nil
    }
}

func initializeClients(logins: [NSObject:AnyObject]?) -> AWSTask? {
    //Create identity provider managet with logins
    let manager = CustomIdentityProviderManager(tokens: logins!)
    self.credentialsProvider?.setIdentityProviderManagerOnce(manager)        
    return self.credentialsProvider?.getIdentityId()
}

注销时:

// Clear ALL saved values for this provider (identityId, credentials, logins). [docs][1]
let keychain = A0SimpleKeychain(service:"…")
keychain.clearAll()

我还尝试添加:

credentialsProvider!.clearCredentials()
credentialsProvider!.clearKeychain()

是否有人正在使用AWS iOS SDK并已成功编码注销,以便新用户可以干净地登录?

有一个奇怪的命名方法凭据Provider.set标识提供商管理器一旦()-我找不到这个记录,但它的名字表明它应该每个会话只被调用一次。但是如果keychain.clearAll()删除了登录,那么每次新用户登录时,都需要调用set标识符提供商管理器一旦,以便每次都设置登录

共有1个答案

马晓博
2023-03-14

你能描述一下你的登录/注销流程吗?Cognito不支持每个标识来自同一个提供商的多个登录,所以听起来,除非您使用多个,否则它实际上不会更改标识。

无论如何,您是否在凭据提供程序上尝试了clearKeyChain方法?它主要用于像这样的用例——清除一切。

 类似资料:
  • 问题内容: 我正在尝试使用Java从使用SFTP(而不是FTPS)的服务器检索文件。我怎样才能做到这一点? 问题答案: 另一个选择是考虑查看JSch库。JSch似乎是一些大型开源项目的首选库,其中包括Eclipse,Ant和Apache Commons HttpClient。 它很好地支持用户/通过和基于证书的登录,以及所有其他许多美味的SSH2功能。 这是通过SFTP检索的简单远程文件。错误处理

  • 我正试图从ftp服务器检索一个文件,但我得到如下错误。请你帮帮我好吗 导入java.io.BufferedOutputStream; 导入java.io.file; 导入java.io.FileOutputStream; 导入java.io.IOException; 导入java.io.InputStream; 导入java.io.OutputStream; 导入java.text.DateFor

  • 在以下片段中,是blob键吗?

  • 我正在尝试使用phonegap构建ios应用程序 我希望来自远程服务器的数据显示在phonegap中。在我的服务器上我有php/mysql,在客户端我有phonegap和在jquery mobile中开发应用程序。 我知道我需要使用jsonp,但我有问题。 在服务器端,我开发了非常简单的应用程序。 我有两个php页面。 第一个php页面列表。php,显示导航列表(主页、关于我们、画廊)。第二个ph

  • 我想在项目拆除脚本中添加项目的endpoint。在运行项目之前,用户将通过所有请求和测试请求分配他们的endpoint,为了获得所有请求和测试请求的endpoint,语法是什么? 我看到了一个使用测试步骤的示例,但我不想通过测试步骤路由检索它: 分解脚本使用日志、上下文、运行程序和项目变量。 谢谢

  • 本文向大家介绍SAP BI从Web服务检索PDF,包括了SAP BI从Web服务检索PDF的使用技巧和注意事项,需要的朋友参考一下 尝试使用REST SDK来检索文档并将其转换为PDF。请按照以下步骤操作: 登录:POST / biprws / logon / long 获取文档提示(如果有的话)GET / biprws / raylight / v1 / documents / 5690743