swift - 无法使用 swift SDK 对 aws appsync 的用户进行身份验证

标签 swift xcode amazon-web-services amazon-cognito aws-appsync

我正在尝试使用 AWS Swift SDK 从我的 Swift 移动应用程序连接到我的 AWS AppSync 服务,但不断收到以下错误:

Error occurred: (401 unauthorized) Did not receive a successful HTTP code.

我正在使用用户池,并按照 swift 教程设置了所有内容。我的问题是,如何将控制台中生成的 AppSync.json 配置文件合并到我的请求中?这在教程中没有提到,可能是我无法连接的原因。

json 文件如下所示:

{
    "graphqlEndpoint": "my_endpoint_url",
    "region": "us-east-1",
    "authenticationType": "AMAZON_COGNITO_USER_POOLS",
    "apiKey": null
}

目前我正在使用以下配置:

// Set up  Amazon Cognito credentials
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: CognitoIdentityRegion,
                                                        identityPoolId: CognitoIdentityPoolId, identityProviderManager: pool)
// You can choose your database location, accessible by SDK
let databaseURL = URL(fileURLWithPath:NSTemporaryDirectory()).appendingPathComponent(database_name)

do {
    // Initialize the AWS AppSync configuration

    let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL,
                                                          serviceRegion: AppSyncRegion,
                                                          credentialsProvider: credentialsProvider,
                                                          databaseURL:databaseURL)

    appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncConfig)
    // Set id as the cache key for objects
    appSyncClient?.apolloClient?.cacheKeyForObject = { $0["id"] }
} catch {
    print("Error initializing appsync client. \(error)")
}

编辑#1

事实证明,该示例使用的是 API key 方法而不是用户池。所以现在我将配置更改为:

let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL, serviceRegion: AppSyncRegion, userPoolsAuthProvider: CognitoUserPoolsAuthProvider(pool: pool))

问题是现在的消息是:

Use of unresolved identifier 'CognitoUserPoolsAuthProvider'

如果我尝试:

let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL, serviceRegion: AppSyncRegion, userPoolsAuthProvider: AWSCognitoUserPoolsAuthProvider(pool: pool))

错误是:

'AWSCognitoUserPoolsAuthProvider' cannot be constructed because it has no accessible initializers

不确定如何满足配置中的 userPoolsAuthProvider: 参数。

最佳答案

要解决您的特定问题,userPoolsAuthProvider 需要接受一个扩展 AWSCognitoUserPoolsAuthProvider 协议(protocol)的类。所以你的实例化看起来像这样:

 let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL,
                                                          serviceRegion: AppSyncRegion,
                                                          userPoolsAuthProvider: self,
                                                          databaseURL:databaseURL)

然后在您创建 AppSyncClient 的类中,您将像这样扩展:

extension YourClass: AWSCognitoUserPoolsAuthProvider {
  func getLatestAuthToken() -> String {
    var token: String = ""

    // pool is an instance of AWSCognitoIdentityUserPool
    self.pool?.currentUser()?.getSession().continueOnSuccessWith(block: { (task) -> Any? in 
      token = task.result!.idToken!.tokenString
      return nil
    }).waitUnitFinished()
  }

  return token
}

此外,我认为默认情况下 AppSync 配置会在您的项目中查找 awsconfiguration.json 文件。您不久前发布了这篇文章,因此 AWS 服务和 AppSync 可能发生了变化。

希望对你有帮助

关于swift - 无法使用 swift SDK 对 aws appsync 的用户进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49204014/

相关文章:

ios - 按钮未改变位置

ios - 将 Axe DevTools 导入 iOS 单元测试和 UITests

c++ - 如何在 Xcode 的 "All Output"窗口中查看 Google Test 的彩色输出?

ios - iOS 中的 AWS SDK 常量未解析标识符

ios - 如何在不使用按钮的情况下直接点击将显示地址的单元格?

ios - didSelectItemAtIndexPath 修改 UICollectionView 中的多个单元格

ios - 录制音频文件并保存,然后随时间ios播放

c++ - 仅当类重写方法时,XCode 4.3/4.4 类型信息才会在动态加载的共享库中实例化的类丢失

java - 为什么上传到 S3 的文件的内容类型为 application/octet-stream,除非我将文件命名为 .html?

amazon-web-services - 如何在 AWS DocumentDB 中拥有不区分大小写的唯一索引?