我正在开发一个使用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/

10-10 14:47