Concierge-Auth
view release on metacpan or search on metacpan
examples/05-api-keys.pl view on Meta::CPAN
$suffix = 'RO';
} elsif ($key_type eq 'admin') {
$key_part = $auth->gen_random_token(32, 'url_safe');
$suffix = 'ADM';
} elsif ($key_type eq 'webhook') {
$key_part = $auth->gen_random_token(24, 'alphanumeric');
$suffix = 'WHK';
} else { # standard
$key_part = $auth->gen_random_token(24, 'url_safe');
$suffix = 'STD';
}
my $api_key = "${user_prefix}_${app_prefix}_${timestamp}_${key_part}_${suffix}";
return {
key => $api_key,
username => $username,
app_name => $app_name,
key_type => $key_type,
permissions => $permissions || [],
created_at => time(),
last_used => undef
};
}
sub extract_key_info {
my ($api_key) = @_;
# Parse the structured key format
if ($api_key =~ /^([A-Z]{3})_([A-Z]{3})_([0-9a-fA-F]{8})_([A-Za-z0-9_-]+)_([A-Z]{2,3})$/) {
my ($user_prefix, $app_prefix, $timestamp, $key_part, $suffix) = ($1, $2, $3, $4, $5);
my %type_map = (
'RO' => 'readonly',
'ADM' => 'admin',
'WHK' => 'webhook',
'STD' => 'standard'
);
return {
user_prefix => $user_prefix,
app_prefix => $app_prefix,
timestamp => hex($timestamp),
key_part => $key_part,
key_type => $type_map{$suffix} || 'unknown',
created_at => hex($timestamp)
};
}
return;
}
print "--- API Key Generation ---\n";
# Generate keys for different users and applications
my @key_specs = (
['alice', 'webapp', 'standard', ['read', 'write']],
['alice', 'mobile', 'readonly', ['read']],
['bob', 'dashboard', 'admin', ['read', 'write', 'delete', 'admin']],
['charlie', 'webhook', 'webhook', ['webhook']],
['alice', 'backup', 'readonly', ['read', 'export']]
);
my @generated_keys;
for my $spec (@key_specs) {
my ($username, $app, $type, $perms) = @$spec;
my $key_info = generate_api_key($username, $app, $type, $perms);
push @generated_keys, $key_info;
printf "%-8s/%-10s (%s): %s\n",
$username, $app, $type, $key_info->{key};
}
print "\n--- Key Information Extraction ---\n";
for my $key_info (@generated_keys) {
my $extracted = extract_key_info($key_info->{key});
if ($extracted) {
printf "Key: %s...\n", substr($key_info->{key}, 0, 20);
printf " User prefix: %s | App prefix: %s | Type: %s\n",
$extracted->{user_prefix}, $extracted->{app_prefix}, $extracted->{key_type};
printf " Created: %s\n", scalar localtime($extracted->{created_at});
}
print "\n";
}
print "--- Key Type Examples ---\n";
# Demonstrate different key types and their characteristics
my %key_types = (
'readonly' => {
desc => 'Read-only access, safe for client-side use',
perms => ['read', 'list', 'export'],
length => 'medium'
},
'standard' => {
desc => 'Standard API access for most applications',
perms => ['read', 'write', 'update'],
length => 'medium'
},
'admin' => {
desc => 'Full administrative access',
perms => ['read', 'write', 'delete', 'admin', 'user_management'],
length => 'long'
},
'webhook' => {
desc => 'Webhook validation and callbacks',
perms => ['webhook', 'callback', 'event_receive'],
length => 'medium'
}
);
for my $type (sort keys %key_types) {
my $info = $key_types{$type};
my $sample_key = generate_api_key('demo', 'example', $type, $info->{perms});
printf "%-10s: %s\n", uc($type), $info->{desc};
printf "%-10s Key: %s\n", '', $sample_key->{key};
printf "%-10s Permissions: %s\n", '', join(', ', @{$info->{perms}});
( run in 1.519 second using v1.01-cache-2.11-cpan-df04353d9ac )