Passing a bearer token in a 'Web Test' without Visual Studio?

azure-application-insights, fiddler, visual-studio, visual-studio-2015

Solution

Assuming this comes back as the following example you can use a regex extraction to get it.

`{"token_type":"Bearer","scope":"user_impersonation","expires_in":"3600 ... "access_token":"{{TOKEN}}", ...}`

<?xml version="1.0" encoding="utf-8"?>
<TestCase Name="FiddlerGeneratedWebTest" Id="" Owner="" Description="" Priority="0" Enabled="True" CssProjectStructure="" CssIteration="" DeploymentItemsEditable="" CredentialUserName="" CredentialPassword="" PreAuthenticate="True" Proxy="" RequestCallbackClass="" TestCaseCallbackClass="">
  <Items>
    <Request Method="POST" Version="1.1" Url="https://example.com/connect/token" ThinkTime="8" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8">
      <ExtractionRules>
            <ExtractionRule Classname="Microsoft.VisualStudio.TestTools.WebTesting.Rules.ExtractRegularExpression, Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" VariableName="token" DisplayName="Extract Regular Expression" Description="Extract text from the response matching a regular expression and place it into the test context.">
              <RuleParameters>
                <RuleParameter Name="RegularExpression" Value=".*&quot;access_token&quot;:&quot;([^&quot;]*)&quot;.*" />
                <RuleParameter Name="IgnoreCase" Value="True" />
                <RuleParameter Name="Required" Value="True" />
                <RuleParameter Name="Index" Value="0" />
                <RuleParameter Name="HtmlDecode" Value="True" />
                <RuleParameter Name="UseGroups" Value="True" />
              </RuleParameters>
            </ExtractionRule>
      </ExtractionRules>
      <Headers>
        <Header Name="Content-Type" Value="application/x-www-form-urlencoded" />
      </Headers>
      <FormPostHttpBody ContentType="application/x-www-form-urlencoded">
        <FormPostParameter Name="client_id" Value="myclientid" UrlEncode="True" />
        <FormPostParameter Name="client_secret" Value="password123" UrlEncode="True" />
        <FormPostParameter Name="grant_type" Value="client_credentials" UrlEncode="True" />
        <FormPostParameter Name="scope" Value="myscopes" UrlEncode="True" />
      </FormPostHttpBody>
    </Request>
    <Request Method="GET" Version="1.1" Url="https://example.com/api/resources" ThinkTime="0" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8">
      <Headers>
        <Header Name="Authorization" Value="Bearer {{token}}" />
      </Headers>
    </Request>
  </Items>
</TestCase>

Problem

I want to import a ".webtest" in Azure's Application Insights availability feature. I dont have a test edition of Visual Studio, but this MSDN article suggests using Fiddler as another option to creating web tests. I need to perform 2 requests on a REST API: - Request a bearer token from the `connect/token` endpoint. - Perform a GET at `api/resources` with the bearer token (retrieved from the above request) in the header. It's a typical client credentials OAuth 2 flow. I cannot seem to figure out how to do this with Fiddler. Basically I need to extract a value from the response body of request 1 and use it as the header value in request 2. This is what the web test looks like without passing the token: ``` <?xml version="1.0" encoding="utf-8"?> <TestCase Name="FiddlerGeneratedWebTest" Id="" Owner="" Description="" Priority="0" Enabled="True" CssProjectStructure="" CssIteration="" DeploymentItemsEditable="" CredentialUserName="" CredentialPassword="" PreAuthenticate="True" Proxy="" RequestCallbackClass="" TestCaseCallbackClass=""> <Items> <Request Method="POST" Version="1.1" Url="https://example.com/connect/token" ThinkTime="8" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8"> <Headers> <Header Name="Content-Type" Value="application/x-www-form-urlencoded" /> </Headers> <FormPostHttpBody ContentType="application/x-www-form-urlencoded"> <FormPostParameter Name="client_id" Value="myclientid" UrlEncode="True" /> <FormPostParameter Name="client_secret" Value="password123" UrlEncode="True" /> <FormPostParameter Name="grant_type" Value="client_credentials" UrlEncode="True" /> <FormPostParameter Name="scope" Value="myscopes" UrlEncode="True" /> </FormPostHttpBody> </Request> <Request Method="GET" Version="1.1" Url="https://example.com/api/resources" ThinkTime="0" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8"> <Headers> <Header Name="Authorization" Value="Bearer {{token}}" /> </Headers> </Request> </Items> </TestCase> ```

Original source