Documentation
To connect to the API you need a PUBLIC KEY
and a PRIVATE KEY
. Please contact the uConnect Team to obtain a keypair.
The API uses basic authorization. Your PUBLIC KEY
is the username and you must contruct a request signature for the password. The API also expects you to pass a header value X-UTIMESTAMP
with every request.
Your request signature is composed of three parts:
PUBLIC KEY
"GET:1567859520:YOUR_PUBLIC_KEY"
) and hashed with your PRIVATE KEY
. Your application's private key should never be exposed to the public and should be regenerated if you believe it has been compromised.
@mwilson
on IET Slack or @Matt Wilson
on the UCD Slack.
var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(YOUR_PRIVATE_KEY); byte[] messageBytes = encoding.GetBytes($"GET:{timestamp}:{YOUR_PUBLIC_KEY}"); using var hmacsha1 = new HMACSHA1(keyByte); byte[] hashmessage = hmacsha1.ComputeHash(messageBytes); var signature = Convert.ToBase64String(hashmessage); var authBytes = System.Text.Encoding.UTF8.GetBytes($"{YOUR_PUBLIC_KEY}:{signature}"); var auth = Convert.ToBase64String(authBytes); var person = "https://api-url.com" .AppendPathSegments("adusers", "upn", "upn@domain.edu") .WithHeaders( new Dictionary() { { "X-UTIMESTAMP", timestamp }, { "Authorization", $"Basic {auth}" } }) .AllowAnyHttpStatus() //.GetJsonAsync().Result; .GetJsonAsync ().Result;
#force tls12 connection [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $pubKey = "YOUR_PUBLIC_KEY" $privateKey = "YOUR_PRIVATE_KEY" $method = "GET" $timestamp =[int][double]::Parse($(Get-Date -date (Get-Date).ToUniversalTime()-uformat %s)) $sig = $method + ":" + $timestamp + ":" + $pubKey $sha = [System.Security.Cryptography.KeyedHashAlgorithm]::Create("HMACSHA1") $sha.Key = [System.Text.Encoding]::UTF8.Getbytes($privateKey) $enc = [Convert]::Tobase64String($sha.ComputeHash([System.Text.Encoding]::UTF8.Getbytes($sig))) $url = "https://ws.uinform-test.ucdavis.edu/adusers/guid/ce2f2ce1-378b-450b-9ba0-16d68144a6b6" $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add('Accept','Application/Json') $headers.Add('X-UTIMESTAMP', $timestamp) # Create a credential object for HTTP basic auth $p = $enc | ConvertTo-SecureString -asPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($pubKey, $p) # Make API request, selecting JSON properties from response $user = Invoke-WebRequest $url -Method $method -Headers $headers -Credential $credential -UseBasicParsing | ConvertFrom-Json
var privateKey = pm.environment.get("private-key"); var publicKey = pm.environment.get("public-key"); var method = request.method; var tStamp = Math.floor((new Date()).getTime() / 1000); pm.environment.set("uxtimestamp", tStamp); var sigRaw = method + ':' + tStamp + ':' + publicKey; var sigEnc = CryptoJS.HmacSHA1(sigRaw, privateKey); var encoded = CryptoJS.enc.Base64.stringify(sigEnc); pm.environment.set("enc", encoded); var authStr = btoa(publicKey + ':' + encoded); pm.environment.set("auth", 'Basic ' + authStr );
import requests import hmac import base64 import time from hashlib import sha1 privateKey = b'YOUR_PRIVATE_KEY' publicKey = 'YOUR_PUBLIC_KEY' timestamp = int(time.time()) rawSignature = f'GET:{timestamp}:{publicKey}'.encode('utf-8') hashed = hmac.new(privateKey, rawSignature, sha1) signature = base64.b64encode(hashed.digest()) url = 'https://ws.uinform-test.ucdavis.edu/adusers/sam/matwilso' headers = {'X-UTIMESTAMP': f'{timestamp}'} resp = requests.get(url, headers=headers, auth=(publicKey, signature)) if resp.status_code != 200: # This means something went wrong. raise ValueError('Could not connect to api') print(resp.json())