2017-05-15 6 views
0

Cette question peut ressembler à this et this.

Mais ma question est un peu différent:

j'ai une passerelle API qui utilise une mesure autorisateur et a plusieurs étapes, la plupart des ressources qui ont des méthodes (GET/POST) ont l'intégration avec un point de terminaison HTTP normale , ce qui signifie qu'ils ont juste "passthrough" au point de terminaison en question (n'utilise pas l'intégration de proxy HTTP).

Voici un exemple: enter image description here

Ces points d'extrémité pointent tous vers stageVariables.

Cependant, pour une raison particulière, j'ai besoin de mettre à jour cette variable stageVariable avant de l'appeler. Ma pensée est en réglant et en obtenant le $context.authorizer.variableName du $context de l'Authentification Personnalisée.

Mon problème est, comment puis-je mettre à jour cette valeur si je n'utilise pas un Lambda.

Il semble que vous pouvez utiliser les modèles de mappage de corps en quelque sorte (voir this link et this link) mais je ne suis pas sûr de savoir comment les utiliser pour mettre à jour la variable stageVariable?

Des idées?

+0

Ceci n'est pas supporté. Vous pouvez définir des valeurs dans le contexte, mais pas modifier les variables d'étape http://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html. –

+0

@AbhignaNagaraja ok, mais alors comment utiliseriez-vous les variables de contexte dans la demande d'intégration? Quelque chose à noter, j'utilise. NET Core C# – Hexie

Répondre

1

Au cas où quelqu'un d'autre rencontrerait ce problème.

Après 3 jours d'assistance de l'équipe AWS, il semble qu'il y ait 2 problèmes ici;

1 - Confirmé que la modification de stageVariables (du tout) n'est actuellement pas possible.

2 - Il y a une limitation avec les variables $context et $authorizer dans le corps. En remarque: une nouvelle demande de service a été créée et travaillée par l'équipe AWS pour cela.

Pour expliquer:

Actuellement, dans Node.js vous avez accès à l'ensemble de la charge utile des données transmises par la fonction Lambda (dans le paramètre event), qui comprend toutes les variables personnalisées. Ce n'est pas la même chose pour l'équivalent C# - qui utilise l'objet de requête APIGatewayProxyRequest dans une fonction Lambda. Ainsi, même si vous avez accès à la charge utile complète (y compris toutes les variables personnalisées) dans le nœud, dans C#, vous n'avez accès qu'à l'objet APIGatewayProxyRequest.Propriétés peuvent être trouvés here:

Ou bref:

public string Body { get; set; } 
    public IDictionary<string, string> Headers { get; set; } 
    public string HttpMethod { get; set; } 
    public bool IsBase64Encoded { get; set; } 
    public string Path { get; set; } 
    public IDictionary<string, string> PathParameters { get; set; } 
    public IDictionary<string, string> QueryStringParameters { get; set; } 
    public ProxyRequestContext RequestContext { get; set; } 
    public string Resource { get; set; } 
    public IDictionary<string, string> StageVariables { get; set; } 

Par conséquent, ne permettant pas l'accès à la coutume ou de l'objet "inconnu" (s).

Longue histoire courte, à partir de ce moment: vous ne pouvez pas modifier stageVariables par code et si vous le souhaitez, vous travaillez avec des variables personnalisées de toute sorte dans les données utiles étant envoyé à travers, vous devez soit coder par noeud (event)/python, ou éventuellement remplacer une propriété existante dans l'objet APIGatewayProxyRequest.

UPDATE (pour gérer # 2):

Il y a un travail autour d'accéder à l'ensemble de la charge utile des données provenant de:

Un travail autour till est alors avoir votre fonction Lambda prendre un System.IO.Stream au lieu de APIGatewayProxyRequest. Ensuite, vous avez accès au JSON d'origine que vous pouvez analyser vous-même. Vous pouvez récupérer les informations dont vous avez besoin à partir de ce JSON, puis désérialiser JSON à APIGatewayProxyRequest.

1

Vous pouvez définir des valeurs dans le contexte, mais pas modifier les variables de stade

var generatePolicy = function(principalId, effect, resource) { 
    var authResponse = {}; 
    //... 
    // Can optionally return a context object of your choosing. 
    authResponse.context = {}; 
    authResponse.context.stringKey = "stringval"; 
    authResponse.context.numberKey = 123; 
    authResponse.context.booleanKey = true; 
    return authResponse; 
} 

Le contexte sera disponible en

$ context.authorizer.stringKey ...

qui peut être ajouté au modèle de mappage de demande d'intégration pour être transmis à votre backend.

+0

Comme indiqué dans mon commentaire précédent sur la question, ce travail est fait en C#. NET Core, par conséquent, ce code ne aiderait pas. – Hexie

+0

Tant que vous renvoyez un objet avec les mêmes clés, cela fonctionnera. Le code est un exemple dans le noeud js. –

+0

Le problème ici est que c'est un code de nœud, nous luttons toujours (avec l'aide d'AWS) pour obtenir l'équivalent en C# .NET de base. Voir cette question: http://stackoverflow.com/questions/43990385/aws-lambda-c-sharp-accessing-custom-context – Hexie