2017-01-05 3 views
0

Ich arbeite an einem Swift-Projekt, das mehrere in AWS API Gateway integrierte Methoden aufruft. Diese Methoden erfordern IAM-Autorisierung, ich habe diese Methoden mit dem Postman-REST-Client mit AWS Signature V4 mit meinen Anmeldeinformationen getestet, aber ich weiß nicht, ob es der Mangel an Dokumentation oder etwas anderes ist, aber ich kann nicht herausfinden, wie Sie sich bewerben die AWS-Signatur aus meinem Swift-Projekt.API-Gateway-Methode mit IAM-Autorisierung von Swift aufrufen 3

Das verwandte Thema fand ich (es wird in Client-Klasse kommentiert die AWS Schiffe als auch im SDK) diesen Code an die Delegaten hinzuzufügen sind oder vor dem Aufruf, da der Client ein Singleton ist:

let credentialProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "YourIdentityPoolId") 
let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialProvider) 
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 

Ich bin mir ziemlich sicher, dass dieser Code Cognito zum Anmelden verwendet, aber ich möchte Cognito nicht zu meinem Projekt hinzufügen, ich habe meine eigene Datenbank einen Benutzerpool außerhalb von AWS.

Hinweis: Die Swift-Aufrufe funktionieren gut, wenn ich die IAM-Autorisierung in den API-Methoden deaktiviere.

Der Aufruf:

let client = PRUEBAPruebaClient.defaultClient() 
client.petstorewalkthroughFlattenallGet().continueWithBlock({(task: AWSTask) -> AnyObject? in 
     self.showResult(task) 
     return nil 
    }) 
func showResult(task: AWSTask) { 
    if let error = task.error { 
     print("Error: \(error)") 
    } else if let result = task.result { 
     print(result) 
    } 
} 

Die Antwort:

Error: Error Domain=com.amazonaws.AWSAPIGatewayErrorDomain Code=1 "(null)" UserInfo={HTTPBody={ 
    message = "Missing Authentication Token"; 
}, HTTPHeaderFields=<CFBasicHash 0x17407f600 [0x1a81b4bb8]>{type = immutable dict, count = 9, 
entries => 
    0 : X-Cache = <CFString 0x170054ee0 [0x1a81b4bb8]>{contents = "Error from cloudfront"} 
    1 : Content-Type = <CFString 0x170054c70 [0x1a81b4bb8]>{contents = "application/json"} 
    2 : x-amzn-ErrorType = <CFString 0x17007b0c0 [0x1a81b4bb8]>{contents = "MissingAuthenticationTokenException"} 
    3 : x-amzn-RequestId = <CFString 0x17007b300 [0x1a81b4bb8]>{contents = "3c410741-d38e-11e6-9d84-09cbdcab48a7"} 
    4 : Via = <CFString 0x1700bd040 [0x1a81b4bb8]>{contents = "1.1 9d0536684daddf203ff3b546b85c5dfe.cloudfront.net (CloudFront)"} 
    6 : Date = <CFString 0x170054b50 [0x1a81b4bb8]>{contents = "Thu, 05 Jan 2017 21:30:53 GMT"} 
    10 : Content-Length = 43 
    11 : X-Amz-Cf-Id = <CFString 0x1700996e0 [0x1a81b4bb8]>{contents = "dEYo5M0iFCthvydhiViK2L-DlzwoeX0mSHQ1YTBAtQZL0m_w_jdc2g=="} 
    12 : Connection = <CFString 0x170037760 [0x1a81b4bb8]>{contents = "keep-alive"} 
} 
} 

Vielen Dank für Ihre Hilfe !!!

Postman call

Postman response

Antwort

0

Wenn Sie die Berechtigung in Ihrem API-Gateway API mit Ihrer eigenen Datenbank zu implementieren haben Sie zwei Möglichkeiten:

  1. AWS_IAM Genehmigung mit developer authenticated IDs. Hier ist ein Swift code sample
  2. A custom authorizer:

    Mit benutzerdefinierten Anfrage authorizers, Entwickler ihre APIs Inhaber Token-Autorisierung Strategien genehmigen kann, wie OAuth eine AWS Lambda-Funktion. ... Sie können Lambda verwenden, um verschiedene Autorisierungsstrategien zu implementieren (z. B. JWT-Verifizierung, OAuth-Provider-Callout).

Sie nicht brauchen, um Ihre Anfragen mit SigV4 zu unterzeichnen, wenn Sie sich für eine benutzerdefinierte authorizer verwenden, aber Sie werden noch müssen in irgendeiner Art von Inhaber Token im Request-Header zu übergeben. Wenn Sie diese Route wählen, sollten Sie Ihren clientseitigen Swift-Code vereinfachen.