Catalyst-Plugin-OAuth2-AuthorizationServer

 view release on metacpan or  search on metacpan

t/server-refresh-family.t  view on Meta::CPAN

use v5.36;
use Test::More;
use Test::Fatal;
use Digest::SHA qw/sha256/;
use MIME::Base64 qw/encode_base64url/;
use lib 't/lib';
use StubStore;
use TestApp::Model::OAuthStore;

my $class = 'Catalyst::Plugin::OAuth2::AuthorizationServer::Server';
require_ok($class);

my $key      = 'k' x 32;
my $VERIFIER = 'pkce-verifier-' . ( '0' x 29 );

sub fresh_engine { return $class->new(
    store => StubStore->new, signing_key => $key,
    issuer => 'https://as', resource => 'https://rs/mcp',
) }

sub mint_code ( $eng, $verifier, $subject = 'user-9' ) {
    my $challenge = encode_base64url( sha256($verifier) );
    $eng->store->create_client({
        client_id => 'c1', redirect_uris => ['https://app/cb'] });
    my $rid = $eng->validate_authorize({
        client_id => 'c1', redirect_uri => 'https://app/cb',
        response_type => 'code', code_challenge => $challenge,
        code_challenge_method => 'S256', scope => 'example:read',
        resource => 'https://rs/mcp',
    })->{request_id};
    return $eng->issue_code( $subject, $rid )->{code};
}

sub first_pair ( $eng, $verifier = $VERIFIER, $subject = 'user-9' ) {
    my $code = mint_code( $eng, $verifier, $subject );
    return $eng->exchange_authorization_code({
        grant_type => 'authorization_code', code => $code,
        redirect_uri => 'https://app/cb', code_verifier => $verifier,
    });
}

# refresh, returning the new pair
sub do_refresh ( $eng, $rt ) {
    return $eng->refresh(
        { grant_type => 'refresh_token', refresh_token => $rt } );
}

# refresh, returning the exception (undef when it succeeded)
sub try_refresh ( $eng, $rt ) {
    return exception { do_refresh( $eng, $rt ) };
}

# every stored binding, in no particular order, for assertions about
# family identity
sub bindings ( $eng ) {
    my $r = $eng->store->refresh;
    return [ map { $r->{$_}{binding} } keys %$r ];
}

# A live token rotates once, then reports reuse on replay.
{
    my $store = StubStore->new;
    $store->create_refresh_token( 'h1',



( run in 1.024 second using v1.01-cache-2.11-cpan-54e63673c56 )