NAME

Digi-ID implementation in Perl5

DESCRIPTION

Perl5 implementation of [Digi-ID](https://www.digi-id.io/).

Digi-ID Open Authentication Protocol

Pure DigiByte sites and applications shouldn't have to rely on artificial identification methods such as usernames and passwords. Digi-ID is an open authentication protocol allowing simple and secure authentication using public-key cryptography.

Classical password authentication is an insecure process that could be solved with public key cryptography. The problem however is that it theoretically offloads a lot of complexity and responsibility on the user. Managing private keys securely is complex. However this complexity is already addressed in the DigiByte ecosystem. So doing public key authentication is practically a free lunch to DigiByte users.

The protocol is based on the following BIP draft

https://github.com/bitid/bitid/blob/master/BIP_draft.md

USAGE IN WEB APPLICATION

 use Dancer2;
 use DigiByte::DigiID qw(get_qrcode extract_nonce verify_signature);

 get '/login' => sub {
     template 'login' => {
         qrcode => {get_qrcode(request->host)},
     };
 };

 get '/callback' => sub {
    my $credential = from_json do { 
        my $input = request->env->{'psgi.input'};
        local $/; <$input>;
    } or halt "credential not found";

    my $nonce = extract_nonce($credential->{uri})
        or do { 
            status 403; 
            return "Nonce is missing";
        };

    eval { verify_signature(@$credential{qw(address signature uri)}) }
        or do { 
            status(403);
            return "Invalid credential, $@";
        };

    my $db = DB->schema; ## using dbix-lite for example

    my $user = $db->table('digiid_users')
        ->find({digiid => $credential->{address}})
        or do {
            status(403);
            return "digiid is not found: $credential->{address}";
        };

    $db->transaction(sub {
        $db->table('digiid_sessions')->insert({
            nonce      => $nonce,
            digiid     => $user->id,
            created_at => \'NOW()',
        });
    });

    return 'OK';
 };

 get '/ajax' => sub {
    content_type 'application/json';

    my $nonce = params->{nonce}
        or return to_json {ok => 0, error => 'missing nonce'};

    my $db = DB->schema; ## using dbix-lite for example

    my $session = $db->table('digiid_sessions')
        ->find({nonce => $nonce})
            or return to_json {ok => 0};

    my $user = $session->get_digiid_users->get_user
        or return to_json {ok => 0, next => 'scan to login in digibyte wallet'};

    $session->delete;

	return to_json {ok => 1};
 };

 dance;

Demo

https://digibyteforums.io/ (Has a custom interface on top)

Notes

* Pure Perl5 implementation, no need to run a DigiByte node

Credit

Direct Translation from PHP to Perl5 - https://github.com/DigiByte-Core/digiid-php/blob/master/DigiID.php

LINKS

Git Repo: https://github.com/mvu8912/perl5-digibyte-digiid.git

CPAN Module: https://metacpan.org/pod/DigiByte::DigiID