我正在开发一个使用Alexa语音服务并维护不同用户的应用程序,因此用户需要使用Amazon(LWA)登录。我已经实现了它,就像它是在文档中编写的一样,并且可以完美地工作。
LWA文档:https://developer.amazon.com/de/docs/login-with-amazon/use-sdk-ios.html
AMZNAuthorizationManager.shared().authorize(request, withHandler: {(result : AMZNAuthorizeResult?, userDidCancel : Bool, error : Error?) -> () in
if error != nil {
// Handle errors from the SDK or authorization server.
}
else if userDidCancel {
// Handle errors caused when user cancels login.
}
else {
// Authentication was successful.
// Obtain the access token and user profile data.
self.accessToken = result!.token
self.user = result!.user!
}
})
此外,我需要从DynamoDB检索信息,该数据库使用Cognito进行身份验证。如文档中所述,应该有一种方法可以将访问 token 形式的LWA传递给Cognito,但是我找不到合适的位置。他们说LWA提供了AMZNAccessTokenDelegate,但它没有提供。委托(delegate)方法提供Cognito所需的API结果。下面的Cognito文档中的链接与我上面发布的LWA文档中的链接完全相同。
Cognito文档:https://docs.aws.amazon.com/cognito/latest/developerguide/amazon.html
func requestDidSucceed(apiResult: APIResult!) {
if apiResult.api == API.AuthorizeUser {
AIMobileLib.getAccessTokenForScopes(["profile"], withOverrideParams: nil, delegate: self)
} else if apiResult.api == API.GetAccessToken {
credentialsProvider.logins = [AWSCognitoLoginProviderKey.LoginWithAmazon.rawValue: apiResult.result]
}
}
我想念什么?
[编辑]
今天,我仔细浏览了LWA的资源,直到最终找到正确的委托(delegate)方法。
使用AIAuthenticationDelegate代替AMZNAccessTokenDelegate
但这让我坐在接下来的两个问题的前面:
一世。
Value of type 'AWSCognitoCredentialsProvider' has no member 'logins'
也许我必须使用以下内容?
.setValue([AWSCognitoLoginProviderKey.LoginWithAmazon.rawValue: apiResult.result], forKey: "logins")
二。
Use of unresolved identifier 'AWSCognitoLoginProviderKey'
我在这里放什么?也许是我从LWA获得的API key ?
[EDIT2]
我想尝试一下,但是即使我成功登录,
requestDidSucceed
也不会被调用。 最佳答案
class CustomIdentityProvider: NSObject, AWSIdentityProviderManager {
func logins() -> AWSTask<NSDictionary> {
return AWSTask(result: loginTokens)
}
var loginTokens : NSDictionary
init(tokens: [String : String]) {
self.loginTokens = tokens as NSDictionary
}
}
在下面的授权代码中成功
AMZNAuthorizationManager.shared().authorize(request) { (result, userDidCancel, error) in
if ((error) != nil) {
// Handle errors from the SDK or authorization server.
} else if (userDidCancel) {
// Handle errors caused when user cancels login.
} else {
let logins = [IdentityProvider.amazon.rawValue: result!.token]
let customProviderManager = CustomIdentityProvider(tokens: logins)
guard let apiGatewayEndpoint = AWSEndpoint(url: URL(string: "APIGATEWAYURL")) else {
fatalError("Error creating API Gateway endpoint url")
}
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USWest2, identityPoolId: "IDENTITY_ID", identityProviderManager:customProviderManager)
let configuration = AWSServiceConfiguration(region: .USWest2, endpoint: apiGatewayEndpoint, credentialsProvider: credentialsProvider)
}
关于ios - 将LWA token 传递给Cognito,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46852877/