The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Catalyst::Authentication::Store::CouchDB - A storage class for Catalyst Authentication using CouchDB

VERSION

version 0.001

SYNOPSIS

    use Catalyst qw/
                    Authentication
                    Authorization::Roles/;

    __PACKAGE__->config->{authentication} =
                    {
                        default_realm => 'members',
                        realms => {
                            members => {
                                credential => {
                                    class => 'Password',
                                    password_field => 'password',
                                    password_type => 'salted_hash',
                                    password_salt_len => 4,
                                },
                                store => {
                                    class       => 'CouchDB',
                                    couchdb_uri => 'http://localhost:5984',
                                    dbname      => 'demouser',
                                    designdoc   => '_design/user',
                                    view        => 'user',
                                },
                            },
                        },
                    };

    # Log a user in:

    sub login : Global {
        my ( $self, $c ) = @_;

        $c->authenticate({
                          username => $c->req->params->{username},
                          password => $c->req->params->{password},
                          }))
    }

    # verify a role

    if ( $c->check_user_roles( 'editor' ) ) {
        # do editor stuff
    }

DESCRIPTION

The Catalyst::Authentication::Store::CouchDB class provides access to authentication information stored in a CouchDB instance.

CONFIGURATION

The CouchDB authentication store is activated by setting the store config's class element to CouchDB as shown above. See the Catalyst::Plugin::Authentication documentation for more details on configuring the store.

The CouchDB storage module has several configuration options

    __PACKAGE__->config->{authentication} =
                    {                      
                        default_realm => 'members',
                        realms => {
                            members => {
                                credential => {
                                    class => 'Password',
                                    password_field => 'password',
                                    password_type => 'clear'
                                },
                            store => {
                                class       => 'CouchDB',
                                couchdb_uri => 'http://localhost:5984',
                                dbname      => 'demouser',
                                designdoc   => '_design/user',
                                view        => 'user',
                            },
                        },
                    },
                };
class

Class is part of the core Catalyst::Plugin::Authentication module; it contains the class name of the store to be used. This config item is REQUIRED.

couchdb_uri

Contains the URI of the CouchDB instance to query. This config item is REQUIRED.

dbname

Contains the name of the database to query. This config item is REQUIRED.

designdoc

Contains the name of the CouchDB design document to query. This config item is REQUIRED.

view

Contains the name of the view in the design document to query. The 'username' field will be used as the key to query, and the first document retrieved will be used to create the user model. This config item is REQUIRED.

ua

Contains the name of a class to be used for the User Agent. This defaults to LWP::UserAgent if not configured. It is passed through to CouchDB::Client.

USAGE

The Catalyst::Authentication::Store::CouchDB storage module is not called directly from application code. You interface with it through the $c->authenticate() call.

The Catalyst::Authentication::Store::CouchDB fetches a user from CouchDB by querying a view within a CouchDB design document. The view is queried with the username passed in the authenticate call hash as the key, and returns a CouchDB document. This document is then passed to Catalyst::Authentication::Store::CouchDB::User to create the user object.

A suitable view map function is

        function(doc) {
            if (doc.username) {
                emit(doc.username, null);
            }
        }

METHODS

There are no publicly exported routines in the CouchDB authentication store (or indeed in most authentication stores). However, below is a description of the routines required by Catalyst::Plugin::Authentication for all authentication stores. Please see the documentation for Catalyst::Plugin::Authentication::Internals for more information.

new ( $config, $app )

Constructs a new store object.

find_user ( $authinfo, $c )

Finds a user using the information provided in the $authinfo hashref and returns the user, or undef on failure. This is usually called from the Credential. This translates directly to a call to the User object's load() method.

for_session ( $c, $user )

Prepares a user to be stored in the session. This is delegated to the User obect for_session method.

from_session ( $c, $frozenuser)

Revives a user from the session based on the info provided in $frozenuser. This is delegated to the User object from_session method.

user_supports

Provides information about what the user object supports.

NOTES

This module is heavily based on Catalyst::Authentication::Store::DBIx::Class.

The test scripts use clear text passwords. DO NOT DO THIS IN PRODUCTION. Use configuation as shown in the synopsis to use something stronger, such as salted hash passwords.

The test scripts do not connect to a CouchDB instance as standard - they mock the responses that CouchDB would send. To connect to a CouchDB instance, set the CATALYST_COUCHDB_LIVE environment variable before running the test suite. The test suite assumes that a demouser database exists, with a design document called user that contains a user view, and that a document listing a test user with username test and password test exists. To configure this, run the setup_database.pl script in the t/script directory on the distribution. This script will remove any existing demouser database.

BUGS AND LIMITATIONS

There are bound to be bugs - please email the author if you find any.

SEE ALSO

Catalyst::Authentication::Store::DBIx::Class. Catalyst::Plugin::Authentication, Catalyst::Plugin::Authentication::Internals, and Catalyst::Plugin::Authorization::Roles

AUTHOR

Colin Bradford <cjbradford@gmail.com>

COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by Colin Bradford.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.