Extends
lithium\core\Object
Handler for HTTP Digest Authentication
Parameters
- string $request a `\lithium\action\Request` object
Returns
voidSource
protected function _digest($request) {
$realm = $this->_config['realm'];
$data = array(
'username' => null, 'nonce' => null, 'nc' => null,
'cnonce' => null, 'qop' => null, 'uri' => null,
'response' => null
);
$result = array_map(function ($string) use (&$data) {
$parts = explode('=', trim($string), 2) + array('', '');
$data[$parts[0]] = trim($parts[1], '"');
}, explode(',', $request->env('PHP_AUTH_DIGEST')));
$users = $this->_config['users'];
$password = !empty($users[$data['username']]) ? $users[$data['username']] : null;
$user = md5("{$data['username']}:{$realm}:{$password}");
$nonce = "{$data['nonce']}:{$data['nc']}:{$data['cnonce']}:{$data['qop']}";
$req = md5($request->env('REQUEST_METHOD') . ':' . $data['uri']);
$hash = md5("{$user}:{$nonce}:{$req}");
if (!$data['username'] || $hash !== $data['response']) {
$nonce = uniqid();
$opaque = md5($realm);
$message = "WWW-Authenticate: Digest realm=\"{$realm}\",qop=\"auth\",";
$message .= "nonce=\"{$nonce}\",opaque=\"{$opaque}\"";
$this->_writeHeader($message);
return false;
}
return array('username' => $data['username'], 'password' => $password);
}