The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Mojolicious::Plugin::Web::Auth::Site::Dropbox;

use Mojo::Base -base;
use WebService::Dropbox;

has 'key';
has 'secret';
has 'user_info' => 1;

sub moniker { 'dropbox' }

sub _wd {
    my ($self) = @_;
    my $wd = WebService::Dropbox->new({
        key    => $self->key,
        secret => $self->secret,
    });
    return $wd;
}

sub auth_uri {
    my ($self, $c, $callback_uri) = @_;
    $callback_uri or die "Missing mandatory parameter: callback_uri";

    my $wd           = $self->_wd();
    my $redirect_uri = $wd->login($callback_uri);
    $c->session( auth_dropbox => [ $wd->request_token, $wd->request_secret ] );

    return $redirect_uri;
}

sub callback {
    my ($self, $c, $callback) = @_;

    my $cookie = $c->session('auth_dropbox')
        or return $callback->{on_error}->("Session error");

    my $wd = $self->_wd();
    $wd->request_token( $cookie->[0] );
    $wd->request_secret( $cookie->[1] );

    $wd->auth
        or return $callback->{on_error}->( $wd->error );

    my @args = ($wd->access_token, $wd->access_secret);
    push @args, $wd->account_info if ( $self->user_info );

    return $callback->{on_finished}->(@args);
}

1;

__END__