Zend_Auth_Adapter_Http
provides a mostly-compliant implementation of
RFC-2617,
Basic and
Digest HTTP Authentication.
Digest authentication is a method of HTTP authentication that improves upon Basic authentication by
providing a way to authenticate without having to transmit the password in clear text across the network.
Major Features:
Supports both Basic and Digest authentication.
Issues challenges in all supported schemes, so client can respond with any scheme it supports.
Supports proxy authentication.
Includes support for authenticating against text files and provides an interface for authenticating against other sources, such as databases.
There are a few notable features of RFC-2617 that are not implemented yet:
Nonce tracking, which would allow for "stale" support, and increased replay attack protection.
Authentication with integrity checking, or "auth-int".
Authentication-Info HTTP header.
This adapter consists of two sub-components, the HTTP authentication class itself, and the so-called "Resolvers." The HTTP authentication class encapsulates the logic for carrying out both Basic and Digest authentication. It uses a Resolver to look up a client's identity in some data store (text file by default), and retrieve the credentials from the data store. The "resolved" credentials are then compared to the values submitted by the client to determine whether authentication is successful.
The Zend_Auth_Adapter_Http
class requires a configuration array passed to its constructor.
There are several configuration options available, and some are required:
جدول 3.1. Configuration Options
Option Name | Required | Description |
---|---|---|
accept_schemes |
Yes |
Determines which authentication schemes the adapter will accept from the client. Must be
a space-separated list containing 'basic' and/or 'digest' .
|
realm |
Yes | Sets the authentication realm; usernames should be unique within a given realm. |
digest_domains |
Yes, when 'accept_schemes' contains 'digest'
|
Space-separated list of URIs for which the same authentication information is valid. The URIs need not all point to the same server. |
nonce_timeout |
Yes, when 'accept_schemes' contains 'digest'
|
Sets the number of seconds for which the nonce is valid. See notes below. |
proxy_auth |
No | Disabled by default. Enable to perform Proxy authentication, instead of normal origin server authentication. |
ملاحظة | |
---|---|
The current implementation of the |
The resolver's job is to take a username and realm, and return some kind of credential value. Basic authentication expects to receive the Base64 encoded version of the user's password. Digest authentication expects to receive a hash of the user's username, the realm, and their password (each separated by colons). Currently, the only supported hash algorithm is MD5.
Zend_Auth_Adapter_Http
relies on objects implementing
Zend_Auth_Adapter_Http_Resolver_Interface
. A text file resolver class is included with this
adapter, but any other kind of resolver can be created simply by implementing the resolver interface.
The file resolver is a very simple class. It has a single property specifying a filename, which can also
be passed to the constructor. Its resolve()
method walks through the text file, searching
for a line with a matching username and realm. The text file format similar to Apache htpasswd files:
<username>:<realm>:<credentials>\n
Each line consists of three fields - username, realm, and credentials - each separated by a colon. The credentials field is opaque to the file resolver; it simply returns that value as-is to the caller. Therefore, this same file format serves both Basic and Digest authentication. In Basic authentication, the credentials field should be the Base64 encoding of the user's password. In Digest authentication, it should be the MD5 hash discribed above.
There are two equally easy ways to create a File resolver:
<?php $path = 'files/passwd.txt'; $resolver = new Zend_Auth_Adapter_Http_Resolver_File($path);
or
<?php $path = 'files/passwd.txt'; $resolver = new Zend_Auth_Adapter_Http_Resolver_File(); $resolver->setFile($path);
If the given path is empty or not readable, an exception is thrown.
First, set up an array with the required configuration values:
<?php $config = array( 'accept_schemes' => 'basic digest', 'realm' => 'My Web Site', 'digest_domains' => '/members_only /my_account', 'nonce_timeout' => 3600, );
This array will cause the adapter to accept either Basic or Digest authentication, and will require
authenticated access to all the areas of the site under /members_only
and
/my_account
. The realm value is usually displayed by the browser in the password dialog box.
The nonce_timeout
, of course, behaves as described above.
Next, create the Zend_Auth_Adapter_Http object:
<?php require_once 'Zend/Auth/Adapter/Http.php'; $adapter = new Zend_Auth_Adapter_Http($config);
Since we're supporting both Basic and Digest authentication, we need two different resolver objects. Note that this could just as easily be two different classes:
<?php require_once 'Zend/Auth/Adapter/Http/Resolver/File.php'; $basicResolver = new Zend_Auth_Adapter_Http_Resolver_File(); $basicResolver->setFile('files/basicPasswd.txt'); $digestResolver = new Zend_Auth_Adapter_Http_Resolver_File(); $digestResolver->setFile('files/digestPasswd.txt'); $adapter->setBasicResolver($basicResolver); $adapter->setDigestResolver($digestResolver);
Finally, we perform the authentication. The adapter needs a reference to both the Request and Response objects in order to do its job:
<?php assert($request instanceof Zend_Controller_Request_Http); assert($response instanceof Zend_Controller_Response_Http); $adapter->setRequest($request); $adapter->setResponse($response); $result = $adapter->authenticate(); if (!$result->isValid()) { // Bad userame/password, or canceled password prompt }