The vsp_calculate_digest() function is used to calculate on server-side a digest to perform a HTTP digest authentication. When the authentication type is 'digest' the function will return a md5 checksum based on credentials, user name and password. The checksum calculation will be made as required for HTTP Digest authentication to compare against 'response' element of credentials. If the authentication is basic a NULL will be returned.
Name | Description |
---|---|
authtype | 'digest' or 'basic' |
realm | from HTTP Authorization request header |
method | from HTTP request line |
uri | from HTTP Authorization request header |
nonce | from HTTP Authorization request header |
nc | from HTTP Authorization request header |
cnonce | from HTTP Authorization request header |
qop | from HTTP Authorization request header |
response | the client-side calculated digest |
A string containing md5 digest, if 'authtype' option is 'digest'. Otherwise returns null.
The following page check for digest authentication and returns OK if authentication succeeds, otherwise it asks for authentication again.
<?vsp declare auth any; declare cs varchar; auth := app_auth_vec (lines); if (not isarray (auth)) app_get_auth (); cs := vsp_calculate_digest ('u1', 'secret', auth); if (cs is not null and cs = get_keyword ('response',auth)) http ('OK'); else app_get_auth (); ?> -- making the HTTP Digest authentication header create procedure app_get_auth () { http_request_status ('HTTP/1.1 401 Unauthorized'); http_header (sprintf ('WWW-Authenticate: Digest realm="%s", domain="%s", nonce="%s", opaque="%s", stale="%s", qop="auth", algorithm="MD5"\r\n', 'my_realm', http_path(), md5 (datestring (now ())), md5 ('some string for hash'), 'false')); }; -- returns an array suitable for vsp_calculate_digest create procedure app_auth_vec (in lines any) { declare ahdr, arr, authvec any; ahdr := http_request_header (lines, 'Authorization'); if (isstring (ahdr) and ahdr like 'Digest%') { ahdr := subseq (ahdr, 6, length (ahdr)); arr := split_and_decode (ahdr, 0, '\0\0,='); authvec := vector ('authtype', 'Digest', 'method', http_request_get ('REQUEST_METHOD')); foreach (varchar elm in arr) do { declare elm1 varchar; elm1 := trim (elm, '" '); authvec := vector_concat (authvec, vector (elm1)); } } return authvec; }