Catalyst-Plugin-OAuth2-AuthorizationServer

 view release on metacpan or  search on metacpan

t/catalyst-app.t  view on Meta::CPAN

use v5.36;
use Test::More;
use lib 't/lib';
use HTTP::Request::Common qw/GET POST/;
use JSON::MaybeXS qw/encode_json decode_json/;
use Digest::SHA qw/sha256/;
use MIME::Base64 qw/encode_base64url/;
use Crypt::JWT qw/decode_jwt/;

use Catalyst::Test 'TestApp';

my $KEY = 'integration-signing-key-0123456789';

# --- AS metadata ---
{
    my $res = request( GET '/.well-known/oauth-authorization-server' );
    ok( $res->is_success, 'metadata 200' );
    my $m = decode_json( $res->content );
    is_deeply( $m->{code_challenge_methods_supported}, ['S256'], 'S256 advertised' );
    is( $m->{registration_endpoint}, 'http://localhost/oauth/register',
        'registration endpoint' );
}

# --- DCR ---
my $client_id;
{
    my $res = request( POST '/oauth/register',
        'Content-Type' => 'application/json',
        Content => encode_json({ redirect_uris => ['https://app/cb'] }) );
    is( $res->code, 201, 'register 201' );
    $client_id = decode_json( $res->content )->{client_id};
    ok( $client_id, 'got client_id' );
}

# --- DCR rate-limit gate denies when the app says so ---
{
    my $res = request( POST '/oauth/register',
        'Content-Type' => 'application/json',
        'X-Deny-DCR'   => 1,
        Content => encode_json({ redirect_uris => ['https://app/cb'] }) );
    is( $res->code, 429, 'rate-limit gate -> 429' );
    is( decode_json( $res->content )->{error}, 'too_many_requests', 'error body' );
}

# --- authorize: our TestApp authn hook auto-consents as "user-1" and
#     redirects to redirect_uri?code=... ---
my $verifier  = 'the-code-verifier-value-0123456789012345678';
my $challenge = encode_base64url( sha256($verifier) );
my $code;
{
    my $res = request( GET '/oauth/authorize?'
        . "client_id=$client_id&redirect_uri=https://app/cb&response_type=code"
        . "&code_challenge=$challenge&code_challenge_method=S256"
        . '&scope=example:read&resource=https://rs/mcp&state=st1' );
    is( $res->code, 302, 'authorize redirects' );
    my $loc = $res->header('Location');
    like( $loc, qr{\Qhttps://app/cb\E\?code=}, 'redirect carries code' );
    like( $loc, qr/state=st1/, 'redirect carries state' );
    ($code) = $loc =~ /code=([^&]+)/;
    ok( $code, 'extracted code' );
}

# --- token: authorization_code grant ---
my $refresh;



( run in 0.958 second using v1.01-cache-2.11-cpan-f0ff5d10edf )