/// <summary> /// Computes the Client Assertion portion of the JWT /// </summary> /// <param name="header">The JSON Web Token header</param> /// <param name="claimSet">The JSON Web Token claim set</param> /// <param name="clientSecret">The client's secret</param> /// <returns>The assertion</returns> public string BuildAssertion(JWTHeader header, JWTClaimSet claimSet, string clientSecret) { // Serialize the header and claimSet string serializedHeader = JsonConvert.SerializeObject(header); string serializedClaimSet = JsonConvert.SerializeObject(claimSet); // Base64Encode the header and claimSet string encodedHeader = Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(serializedHeader)); string encodedClaimSet = Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(serializedClaimSet)); // Concatenate the header and the claims separated with a '.': [header].[claims] string message = string.Join(".", encodedHeader, encodedClaimSet); // Apply an HMAC/SHA-256 hash* to the concatenated content using the Client Secret as the key HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(clientSecret)); byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); // Base64Encode the result of the hash string signature = Convert.ToBase64String(hash); // Combine the encoded elements as follows [header].[claims].[hash] string assertion = string.Join(".", encodedHeader, encodedClaimSet, signature); return assertion; }
/// <summary> /// Retrieves a new token from Webtrends auth service /// </summary> public string Execute() { var builder = new JWTBuilder(); var header = new JWTHeader { Type = "JWT", Algorithm = "HS256" }; var claimSet = new JWTClaimSet { Issuer = clientId, Principal = clientId, Audience = audience, Expiration = DateTime.Now.AddSeconds(30), Scope = scope }; string assertion = builder.BuildAssertion(header, claimSet, clientSecret); var client = new RestClient(authUrl); var request = new RestRequest("token/", Method.POST); request.AddParameter("client_id", clientId); request.AddParameter("client_assertion", assertion); request.AddParameter("grant_type", "client_credentials"); request.AddParameter("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer"); var response = client.Execute(request).Content; return (string)JObject.Parse(response)["access_token"]; }
/// <summary> /// Retrieves a new token from Webtrends auth service /// </summary> public string Execute() { var builder = new JWTBuilder(); var header = new JWTHeader { Type = "JWT", Algorithm = "HS256" }; var claimSet = new JWTClaimSet { Issuer = clientId, Principal = clientId, Audience = audience, Expiration = DateTime.Now.ToUniversalTime().AddSeconds(30), Scope = scope }; string assertion = builder.BuildAssertion(header, claimSet, clientSecret); var client = new RestClient(authUrl); var request = new RestRequest("token/", Method.POST); request.AddParameter("client_id", clientId); request.AddParameter("client_assertion", assertion); request.AddParameter("grant_type", "client_credentials"); request.AddParameter("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer"); var response = client.Execute(request).Content; return (string)JObject.Parse(response)["access_token"]; }