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

AWS Cognito:注销后立即重新登录的问题

赵健柏
2023-03-14

(注意:这与我发布的问题有关,但由于我最初的问题得到了回答,而我现在遇到了一个不同的问题,所以我将此作为一个新问题发布。)

我正在设置注册和登录一个使用DynamoDB和AWS Cognito的iOS应用程序。我最终让注册登录过程正常工作,但我注意到,每当我注销并立即尝试重新登录时,应用程序都会失败,我会收到错误消息无效的登录令牌。不能传入认知令牌。只有在我关闭并重新启动应用程序后,我才能再次成功登录。

我主要使用这个示例项目来设置注册,但是当我实现登录方法时,我在从Objective-C转换到Swift时遇到了一些问题。我无法让示例中的登录过程正常工作,因此我设置了一个显式登录方法:

if locked { return }
    trimRegistrationValues()
    let name = usernameField.text!
    let user = pool!.getUser(name)
    lock()
    user.getSession(name, password: passwordField.text!, validationData: nil, scopes: nil).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: {
        (task:AWSTask!) -> AnyObject! in

        if task.error != nil {
            self.sendErrorPopup("ERROR: Unable to sign in. Error description: " + task.error!.description)
        } else {
            print("Successful Login")

            let loginKey = "cognito-idp.us-east-1.amazonaws.com/" + USER_POOL_ID
            var logins = [NSString : NSString]()
            self.credentialsProvider!.identityProvider.logins().continueWithBlock { (task: AWSTask!) -> AnyObject! in

                if (task.error != nil) {
                    print("ERROR: Unable to get logins. Description: " + task.error!.description)

                } else {
                    if task.result != nil{
                        let prevLogins = task.result as! [NSString:NSString]
                        print("Previous logins: " + String(prevLogins))
                        logins = prevLogins
                    }
                    logins[loginKey] = name
                    let manager = IdentityProviderManager(tokens: logins)
                    self.credentialsProvider!.setIdentityProviderManagerOnce(manager)
                    self.credentialsProvider!.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in

                        if (task.error != nil) {
                            print("ERROR: Unable to get ID. Error description: " + task.error!.description)

                        } else {
                            print("Signed in user with the following ID:")
                            print(task.result)
                            dispatch_async(dispatch_get_main_queue()){
                                self.performSegueWithIdentifier("mainViewControllerSegue", sender: self)
                            }
                        }
                        return nil
                    }
                }
                return nil
            }
        }
        self.unlock()
        return nil
    })

目前,我的AppDelegate类中用于设置Cognito的代码如下所示:

let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId:APP_CLIENT_ID, clientSecret: APP_CLIENT_SECRET, poolId: USER_POOL_ID)
    let pool = AWSCognitoIdentityUserPool(forKey:USER_POOL_NAME)
    pool.delegate = self
    self.storyboard = UIStoryboard(name: "Main", bundle: nil)
    self.credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: IDENTITY_POOL_ID, identityProviderManager:pool)
    let serviceConfiguration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialsProvider!)
    AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: userPoolConfiguration, forKey: USER_POOL_NAME)
    let manager = IdentityProviderManager(tokens: [NSString:NSString]())
    self.credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: IDENTITY_POOL_ID, identityProviderManager: manager)

    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = serviceConfiguration
    startPasswordAuthentication()

在登录ViewController中的viewdiLoad()方法只包含这一行关于我用于登录的Cognito值:

if pool == nil{
        pool = AWSCognitoIdentityUserPool(forKey:USER_POOL)
    }

在从登录ViewController到用户登录后看到的第一个视图的prepareforsgue()案例中,我通过调用以下命令设置用户:

destination.user = pool!.getUser(usernameField.text!)

在从该视图注销的方法中,我调用user!。注销()

我注意到许多Cognito示例项目在注销后调用credentialsProvider.clearKeychain(),但这并没有解决我的问题。我一直很难找到很多例子来具体说明如何通过Cognito注销。我还听说AWS凭据在登录到这样的应用程序一小时后过期。如果我想解决此问题并避免其他可能迫使我的用户重新启动应用程序以登录的情况,那么处理凭据的正确方法是什么?


共有1个答案

仉磊
2023-03-14

在Log out in添加到user.signOut()getMore需要再次调用!不太确定为什么在SignOut之后会出现这种情况,但肯定为我修复了它。self.user?.getDetails()。连续成功与{(任务)-

 类似资料:
  • 用户登录 在用户登录App账号时调用以下登录方法,从而保证用户是以登录身份进行咨询,是区分会话的用户的唯一标识; 游客咨询不需要调用小能login方法,小能会自动生成一个游客身份标识,在客服端游客身份的用户名显示为:“游客+4位数字”。 App完全退出(被杀掉进程), 再次进入时, 在SDK初始化之后, 如果App本身账号是登录用户, 需要重新调用小能SDK登陆接口,同步用户身份【大多是针对App

  • 登录与注销 用户登录 在App登录的地方,调用小能的login方法,目的是传递账号信息,为客服端显示用户信息。在App被杀死之后,sdk会保持用户的登录状态,不需要再次调用登录的方法。 uid作为用户的唯一标识需要保证唯一性,username可根据需要传入手机号、昵称等信息 /** * @param uid 必填,登录用户的id, 只能输入数字、英文字母和"@._—"四种字符,长度小于等于60位

  • 问题内容: 每当用户注销并尝试再次登录时,树中的所有属性都会重新初始化。 这是我的代码: I tried to use user’s metadata but even that didn’t work. Here is my structure 问题答案: 如果我们要检查用户是否是新用户,则是相同的,如果我们检查 用户是否是首次登录。因此,要解决此问题,我们可以像 这样 在回调中简单地调用方法

  • 我正在使用带有java配置和两个HttpSecurity配置的spring-security 3.2.0.rc2。一个用于REST API,一个用于UI。当我发布到/logout时,它重定向到/login?logout,但随后(错误地)重定向到/login。当我成功地输入用户名和密码时,我会被重定向到登录-注销,并且必须再次输入凭据才能进入主页面。因此,似乎login的permitAll不被用于l

  • 这是春虫吗?由于logout-success-url已设置且不安全,因此在到达logout-success-url后,似乎不应将用户重定向到无效的会话url。 日志如下所示:

  • 我有一个使用Spring安全LDAP的登录页面。身份验证本身工作正常。在我将表单从常规 HTML 更改为主要字体/ JSF 标记后,发生了此问题。用户通过身份验证后,该页不会重定向到索引页,而是在第二次尝试后。由于某种原因,会话被立即清除。我已经阅读了很多关于使用JSF登录的帖子和教程,以及类似的问题,但到目前为止,它们都没有奏效。 以下是我的一些配置: 登录.xhtml 在首字母/JSF之前 l