OAuth2-Flow in BizTalk Orchestration mit dynamischem SendPort
In folgendem Beispiel setzen wir diese Anfrage in einer Orchestration um:
1. Construct Message
Dazu müssen wir uns eine Nachricht in einem Expression-Shape erstellen, die wir an die Authentifizierungsstelle senden. Wir verwenden hierfür den Grant Type „Client Credentials“ und müssen daher eine ClientId und das Client Secret übergeben (optional Resource oder Scope). Diese Werte sollten wir aus seiner sicheren Quelle abfragen und dann als Variablen hier übergeben:
StringOAuth = „grant_type=client_credentials&client_id=“ + VGClientId + „&resource=“ +
VGResource + „&client_secret=“ + VGClientSecret;
MGTokenRequest = new System.Xml.XmlDocument();
Helpers.LoadXLANGMsgFromString(StringOAuth, MGTokenRequest);
Über eine Helperklasse fügen wir jetzt den String noch zu unserer XML Nachricht hinzu:
publicstaticvoidLoadXLANGMsgFromString(string source, XLANGMessage dest)
{
var bytes = Encoding.UTF8.GetBytes(source);
using (MemoryStream ms = new MemoryStream(bytes, 0, bytes.Length, false, true))
{
dest[0].LoadFrom(ms);
}
}
2. Send TokenRequest
Jetzt haben wir unsere Nachricht vollständig zusammengebaut und können diese in Schritt zwei an den Endpunkt schicken. Die NachrichtMGTokenRequest ist hier vom Typ System.Xml.XmlDocument.
3. Send-Receive-Port einrichten
Im SendPort müssen folgende Einstellungen getätigt werden:
- HTTP Method and URL Mapping: POST
- Security Mode: Transport
- Outbound HTTP Headers: Content-Type: application/x-www-form-urlencoded
Der Rückgabewert wird dann im JSON-Format sein, weshalb wir eine ReceiveJson-Pipeline benötigen. Wichtig ist hier den NameSpace des Schemas einzutragen, welches wir im nächsten Schritt erstellen.
4. Receive TokenResponse
Nachdem wir unsere Nachricht jetzt erhalten, können wir uns die Struktur der Nachricht anschauen und daraus ein Schema generieren. Dieses Schema verwenden wir, um in der gerade beschriebenen Pipeline unsere JSON Nachricht verarbeiten zu können und wieder in die Orchestration einzulesen.
Das Schema könnte folgendermaßen aussehen:
5. AccessToken auslesen
Der letzte Schritt besteht darin, den eigentlichen AccessToken, der sich in der Nachricht befindet, auszulesen und in eine Variabel zu speichern. Dafür muss das Element „access_token“ als Distinguished Field promoted werden und kann jetzt in einem Expression Shape in unsere Variable gespeichert werden:
BearerToken = MGTokenResponse.access_token;
Der BearerToken kann jetzt für alle Aufrufe der API als Authentifizierung mitgegeben werden. Am besten funktioniert das dann in Kombination mit einem dynamischen SendPort.
Hier ist ein Beispiel, wie dieser in einem Expression Shape konfiguriert werden muss:
MGDynamicOutput(WCF.BindingType) = „WCF-WebHttp“;
MGDynamicOutput(WCF.SecurityMode) = „Transport“;
MGDynamicOutput(WCF.HttpMethodAndUrl) = „POST“;
MGDynamicOutput(WCF.HttpHeaders) = @“Content-Type: application/json“ + „\n“
+ „Authorization: Bearer “ + BearerToken;MessageSendPort(Microsoft.XLANGs.BaseTypes.Address)=VGResource + „/data/test „;
MessageSendPort(Microsoft.XLANGs.BaseTypes.TransportType)=“WCF-WebHttp“;
Dies ist ein Tipp aus Stuttgart.