iOS 的 Amazon Cognito:禁止访问身份
Amazon Cognito with iOS: Access to Identity Forbidden
提前感谢您的帮助!
我在让 Amazon Cognito 正确 store/synchronize 数据时遇到了一些问题。
在 dataset.synchronize() 行(该行未将数据存储在 Cognito 中),我收到一个很大的输出错误(ID 已加星标),例如:
AWSCredentialsProvider.m line:429 | __73-[AWSCognitoCredentialsProvider
getCredentialsWithCognito:authenticated:]_block_invoke | GetCredentialsForIdentity
failed. Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain
Code=10 "(null)" UserInfo={__type=NotAuthorizedException, message=Access to
Identity '*****' is forbidden.}]
cognitoID 不为零,并且 returns 正确(并且匹配我可以在线阅读的值)
例如,在使用 Facebook 进行身份验证后,我执行以下操作:
if (FBSDKAccessToken.currentAccessToken() != nil)
{
let fbCognitoToken = FBSDKAccessToken.currentAccessToken().tokenString
credentialsProvider.logins = [AWSCognitoLoginProviderKey.Facebook.rawValue: fbCognitoToken]
// Retrieve your Amazon Cognito ID
credentialsProvider.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in
if (task.error != nil) {
print("Error: " + task.error!.localizedDescription)
}
else {
// the task result will contain the identity id
let cognitoId = task.result
//checking if cognito was successful, if true, sets success condition to true to prepare for segue into app
if cognitoId != nil{
print (cognitoId)
cognitoSuccess = true
let syncClient = AWSCognito.defaultCognito()
let dataset = syncClient.openOrCreateDataset("User_Data")
dataset.setString("test@test.com", forKey:"Email")
// credentialsProvider.refresh()
dataset.synchronize()
} }return nil}}
我可以正确地从 Facebook 读取数据,并且据我所知,所有的身份验证都是正确的。我怀疑这里的根本原因很简单,但是花了几天时间,我无法弄清楚!在 AWS 门户 returns all "green checks" 中使用 IAM 检查器来获取 Cognito 函数,所以我确信这也不是服务器端的权限问题。
再次感谢您提供的任何见解!
编辑:
在上面的代码块之前,我调用:
let credentialsProvider = self.initializeCognito()
运行(身份池 ID 已加星标):
func initializeCognito () -> AWSCognitoCredentialsProvider
{
let credentialsProvider = AWSCognitoCredentialsProvider(
regionType: AWSRegionType.USEast1, identityPoolId: "******")
let defaultServiceConfiguration = AWSServiceConfiguration(
region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration
return credentialsProvider
}
当您尝试获取经过身份验证的 ID 的凭据而不提供任何与其链接的提供商令牌时,可能会抛出该异常。 Cognito 要求至少提供一个。
你能检查一下你在失败的 GetCredentialsForIdentity 调用中是否包含了 facebook 令牌吗?如果没有,我想那是你的问题。
编辑:
由于您使用的是 AWSCognito.defaultCognito(),因此遵循 this docs page 上的示例可能有助于确保同步客户端使用正确的凭据提供程序:
let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
最终找到了答案——当我第一次设置 AWS 并遵循亚马逊的一些指南时,我在应用程序的 App Delegate 中放置了代码以创建一个新的 credentialsProvider。我忘了它,然后稍后尝试初始化另一个 credentialsProvider。这种混淆造成了问题,删除 App Delegate 中的初始化解决了身份验证问题。
提前感谢您的帮助!
我在让 Amazon Cognito 正确 store/synchronize 数据时遇到了一些问题。
在 dataset.synchronize() 行(该行未将数据存储在 Cognito 中),我收到一个很大的输出错误(ID 已加星标),例如:
AWSCredentialsProvider.m line:429 | __73-[AWSCognitoCredentialsProvider
getCredentialsWithCognito:authenticated:]_block_invoke | GetCredentialsForIdentity
failed. Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain
Code=10 "(null)" UserInfo={__type=NotAuthorizedException, message=Access to
Identity '*****' is forbidden.}]
cognitoID 不为零,并且 returns 正确(并且匹配我可以在线阅读的值)
例如,在使用 Facebook 进行身份验证后,我执行以下操作:
if (FBSDKAccessToken.currentAccessToken() != nil)
{
let fbCognitoToken = FBSDKAccessToken.currentAccessToken().tokenString
credentialsProvider.logins = [AWSCognitoLoginProviderKey.Facebook.rawValue: fbCognitoToken]
// Retrieve your Amazon Cognito ID
credentialsProvider.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in
if (task.error != nil) {
print("Error: " + task.error!.localizedDescription)
}
else {
// the task result will contain the identity id
let cognitoId = task.result
//checking if cognito was successful, if true, sets success condition to true to prepare for segue into app
if cognitoId != nil{
print (cognitoId)
cognitoSuccess = true
let syncClient = AWSCognito.defaultCognito()
let dataset = syncClient.openOrCreateDataset("User_Data")
dataset.setString("test@test.com", forKey:"Email")
// credentialsProvider.refresh()
dataset.synchronize()
} }return nil}}
我可以正确地从 Facebook 读取数据,并且据我所知,所有的身份验证都是正确的。我怀疑这里的根本原因很简单,但是花了几天时间,我无法弄清楚!在 AWS 门户 returns all "green checks" 中使用 IAM 检查器来获取 Cognito 函数,所以我确信这也不是服务器端的权限问题。
再次感谢您提供的任何见解!
编辑: 在上面的代码块之前,我调用:
let credentialsProvider = self.initializeCognito()
运行(身份池 ID 已加星标):
func initializeCognito () -> AWSCognitoCredentialsProvider
{
let credentialsProvider = AWSCognitoCredentialsProvider(
regionType: AWSRegionType.USEast1, identityPoolId: "******")
let defaultServiceConfiguration = AWSServiceConfiguration(
region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration
return credentialsProvider
}
当您尝试获取经过身份验证的 ID 的凭据而不提供任何与其链接的提供商令牌时,可能会抛出该异常。 Cognito 要求至少提供一个。
你能检查一下你在失败的 GetCredentialsForIdentity 调用中是否包含了 facebook 令牌吗?如果没有,我想那是你的问题。
编辑:
由于您使用的是 AWSCognito.defaultCognito(),因此遵循 this docs page 上的示例可能有助于确保同步客户端使用正确的凭据提供程序:
let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
最终找到了答案——当我第一次设置 AWS 并遵循亚马逊的一些指南时,我在应用程序的 App Delegate 中放置了代码以创建一个新的 credentialsProvider。我忘了它,然后稍后尝试初始化另一个 credentialsProvider。这种混淆造成了问题,删除 App Delegate 中的初始化解决了身份验证问题。