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

在iOS应用程序中测试Cognito身份验证

丌官运珧
2023-03-14

我有一个iOS应用程序,实现了与CognitoYourUserPoolsSample非常相似的Cognito身份验证。最重要的片段在SignInViewController.swift中:

>

var passwordAuthenticationCompletion: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>?
...
@IBAction func signInPressed<...> {
    ...
    let authDetails = AWSCognitoIdentityPasswordAuthenticationDetails(username: self.username.text!, password: self.password.text! )
    self.passwordAuthenticationCompletion?.set(result: authDetails)
    ...

后来,我们得到成功或错误的响应:

extension SignInViewController: AWSCognitoIdentityPasswordAuthentication {
      public func getDetails<...> {
          DispatchQueue.main.async {
              // do something in case of success
      ...

      public func didCompleteStepWithError<...> {
          DispatchQueue.main.async {
             // do something in case of failure
      ...

我也有一个用户界面测试,它填充用户名和密码,点击登录并验证响应:

class MyAppUITests: XCTestCase {
    ...
    func loginTest() {
        let usernameField = <...>
        usernameField.tap()
        usernameField.typeText("user@domain.com")
        ... 
        // same for password field
        // then click Sign In
        <...>.buttons["Sign In"].tap()

目前,该测试针对的是实际的AWS基础设施,由于许多原因,该基础设施并不理想。我想要的是模拟来自AWS的各种响应。

我该怎么做?

我认为最好的办法是嘲弄或刺伤任务队列,但我不知道如何处理。任何方向都将不胜感激。如果你以另一种方式处理类似的任务,我也想听听你的想法,谢谢。

共有1个答案

司徒志强
2023-03-14

好的,我不太熟悉AWS iOS SDK,也不太熟悉它是如何实现身份验证流的,所以我对下面的内容略知一二。我希望这不是一个完整的答案,而是一个总体的“策略”。我在我当前的项目中实现了类似的方法,不仅仅是登录,实际上是所有远程连接。

您需要做三件事:

>

  • 在UI测试目标内运行一个小型本地Web服务器。在我目前的项目中,我使用大使馆和大使馆。将其配置为返回Cognito(或另一个endpoint)通常给出的任何响应。我只是手动地curled一个请求并将响应保存在某个地方,但在我的例子中,我收到了简单的数据(例如,没有在webview中显示完整的登录页面…)。我的猜测是Cognito实际上显示了一个登录(web)视图,并且在成功登录时使用一个深度链接“返回”到您的应用程序,最终调用您的AWSCognitoIdentityPasswordAuthentication方法(成功或错误)。您可以拥有测试目标,也就是说,如果您知道深度链接是什么样子的,那么Web服务器可以直接调用它(应该可以找到什么?)。

    添加一些机制来在测试期间切换Cognitoendpoint。不幸的是,这需要添加生产代码,但如果操作正确,应该不会太困难。我是通过使用在测试期间设置的启动环境变量来实现的(见下文)。除非您的Web服务器支持https(Embassy不支持开箱即用),否则这还需要以某种方式配置应用程序传输安全性。最困难的部分当然是弄清楚endpoint在SDK中的何处构造以及如何更改它。快速查看文档使我相信webDomain是它保存的地方,但我不知道它是如何设置的。该属性甚至是只读的,这使事情变得复杂。不过,我假设您可以在项目的某些配置中更改它?否则的话,它就像一个方法swizzling的案例。。。对不起,我不能在这里提供更多的声音方向。

    在测试期间,确保将在相关应用程序流期间访问的真实endpoint切换到http://localhost/...。我使用xguiapplication().launchenEnvironment[“somekey”]=“TESTINGKEY”,这与我在第二步中准备的生产代码相匹配。在我的例子中,我可以简单地加载不同的endpoint(具有本地主机域,或者与原始域具有相同的路径)。根据测试用例(成功登录、无效凭据等)配置Web服务器的响应。

    我承认这是/是一个很大的工作,但对我来说这是值得的,因为我可以轻松地运行整个应用程序流(涉及大量传出请求),而无需任何网络访问。无论如何,我必须自己实现我们的auth系统,这让我能够控制使用了什么URL以及在哪里使用URL,这样就可以很容易地根据启动环境变量在一个地方将它们删除。在我的案例中,最丑陋的部分实际上只是在我的测试中启用ATS异常,出于各种原因,我不得不使用运行脚本。

  •  类似资料:
    • 在Spring Boot项目中,我们启用了Spring Security性,并使用承载令牌应用了KeyClope身份验证,如以下文章所述: https://www.keycloak.org/docs/3.2/securing_apps/topics/oidc/java/spring-security-adapter.html https://www.keycloak.org/docs/3.2/se

    • 所以我已经成功地验证了用户与Cognito中的用户池。根据我的理解,现在在我们利用任何AWS服务(Dynamodb,S3等)之前,我们需要再次从AWS Cognito Credential提供商获得。 Cognito用户池(验证)用户登录 通过配置AWSCOgnitoRedentialsProvider获取CognitoID 为我们想要与之交互的任何服务制作AWS CAL 从用户PoolID委托成

    • 问题内容: 我想在我的Java应用程序中使用Windows NTLM认证来透明地认证Intranet用户。如果使用浏览器(单点登录),用户将不会注意到任何身份验证。 我发现了一些具有NTLM支持的库,但是不知道要使用哪个库: http://spnego.sourceforge.net/ http://sourceforge.net/projects/ntlmv2auth/ http://jcifs

    • 我有一个使用Kafka Streams API的应用程序。我在当地工作时没有问题。我想连接到远程Kafka代理进行阶段测试。远程Kafka代理设置为使用GSSAPI sasl机制并使用Kerberos。我运行用java编写的Streams应用程序时出错。在我查找错误消息后,我找到了答案,但仍然有问题。 错误消息;获取相关id为3的元数据时出错:{[APPID]-KTABLE-AGGREGATE-S

    • 我需要在我们的Web应用程序中使用LDAP/AD服务器实现SSO身份验证和验证用户。Web应用程序是使用Spring(Java)/Hibernate制作的,应用程序服务器是UAT中的Jboss和生产中的Webphere。 我正在寻找一些好的简单的解决方案,可以帮助我实现它,从几个朋友那里听说华夫饼是一个很好的解决方案,但是在网上搜索并尝试了几天之后,我不确定我是否朝着正确的方向前进。我在这方面很幼

    • 我正在尝试在 Swift 中创建一个 iOS 应用程序,该应用程序使用 AWS Lambda 使用以下身份验证服务 - https://github.com/danilop/LambdAuth 它使用适用于 iOS 的 AWS 移动开发工具包与迪纳摩数据库和 Lambda 进行通信 - http://docs.aws.amazon.com/mobile/sdkforios/developergui