2017-11-14 3 views
0

Wir haben einige API-Gateway-Endpunkte. Jeder Endpunkt ist mit einem Custom Authorizer (CA) geschützt. Diese CA prüft den HTTP-Aufruf und verifiziert das Vorhandensein des Headers Authorization. Dieser Header muss ein OpenId Connect-Token (ein einfaches JWT-Token) enthalten, damit die CA sie prüfen und einige Überprüfungen und Validierungen vornehmen kann.Senden des JWT-Tokens mit AWS Android SDK

Wenn wir Postman verwenden, um den Endpunkt aufzurufen, funktioniert es ohne ein Problem, da wir die richtigen Header einrichten können.

Die Probleme beginnen zu erhöhen, wenn wir das generierte Android SDK verwenden, um den gleichen Aufruf auszuführen, da jeder Versuch, den Aufruf auszuführen, eine AWS4-Signatur als Header sendet. Wir können herausfinden, wie man Authorization Header mit JWT sendet.

Wir bekommen, was wir brauchen, um ApiClientFactory-Klasse erweitern und das Hinzufügen der Header in einer expliziten Weise:

public class CustomApiClientFactory extends ApiClientFactory { 

    private String LOGIN_NAME = "a.provider.com"; 
    private AWSCredentialsProvider provider; 

    @Override 
    public ApiClientFactory credentialsProvider(AWSCredentialsProvider provider) { 
     this.provider = provider; 
     return super.credentialsProvider(provider); 
    } 

    @Override 
    ApiClientHandler getHandler(String endpoint, String apiName) { 
     final Signer signer = provider == null ? null : getSigner(getRegion(endpoint)); 

     // Ensure we always pass a configuration to the handler 
     final ClientConfiguration configuration = new ClientConfiguration(); 

     return new ApiClientHandler(endpoint, apiName, signer, provider, null, configuration) { 
      @Override 
      Request<?> buildRequest(Method method, Object[] args) { 
       Request<?> request = super.buildRequest(method, args); 
       request.addHeader("Authorization", "Bearer " + ((CognitoCachingCredentialsProvider) provider).getLogins().get(LOGIN_NAME)); 
       return request; 
      } 
     }; 
    } 
} 

Auch wenn es funktioniert, ist es wie eine Abhilfe klingt für mich. Es gibt einige bekannte Best Practices im Umgang mit diesem Problem?

Antwort

0

Das API-Gateway ermöglicht die Definition der Anforderung für jede Methode. Fügen Sie einfach einen HTTP-Anforderungsheader in die Methodenanforderung ein, und das generierte SDK enthält ein Feld zum Angeben der Kopfzeile.

Console: console view that allows adding header

generiert Android SDK:

@com.amazonaws.mobileconnectors.apigateway.annotation.Operation(path = "/companies", method = "GET") 
CompanyList companiesGet(
     @com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "x-vendor-authorization", location = "header") 
     String xVendorAuthorization, 
     @com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "continuationToken", location = "query") 
     String continuationToken, 
     @com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "pageSize", location = "query") 
     String pageSize, 
     @com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "properties", location = "query") 
     String properties); 

SDK Aufruf:

client.companiesGet("abc123AuthToken", "continueToken1", "20", "prop1");