my
(
$op
,
$res
);
ok(
$op
= op(),
'OP portal'
);
my
$i
=
$op
->p->loadedModules->{
'Lemonldap::NG::Portal::Issuer::OpenIDConnect'
};
our
$call_allowed
= 1;
LWP::Protocol::PSGI->register(
sub
{
my
$req
= Plack::Request->new(
@_
);
my
$payload
= {
client_id
=>
"rpid"
,
};
is(
$req
->uri->host,
"request.uri"
,
"only authorized URI is called"
);
ok(
$call_allowed
,
"Call is expected in this scenario"
);
if
(
$req
->path_info eq
"/baduri"
) {
}
if
(
$req
->path_info eq
"/badclientid"
) {
$payload
->{client_id} =
"otherid"
;
}
my
$res
= Plack::Response->new(200);
$res
->content_type(
'application/json'
);
$res
->body(
$i
->createJWT(
$payload
,
"HS256"
,
"rp"
) );
return
$res
->finalize;
}
);
BEGIN {
require
't/test-lib.pm'
;
require
't/oidc-lib.pm'
;
}
my
$debug
=
'error'
;
subtest
"Successful request"
=>
sub
{
my
$idpId
= login(
$op
,
"french"
);
$res
= authorize(
$op
,
$idpId
,
{
response_type
=>
"code"
,
client_id
=>
"rpid"
,
scope
=>
"openid"
,
state
=>
"xxyy"
,
}
);
};
subtest
"Successful request, override of bad redirect_uri"
=>
sub
{
my
$idpId
= login(
$op
,
"french"
);
$res
= authorize(
$op
,
$idpId
,
{
response_type
=>
"code"
,
client_id
=>
"rpid"
,
scope
=>
"openid"
,
}
);
};
subtest
"unauthorized Request URI"
=>
sub
{
my
$idpId
= login(
$op
,
"french"
);
local
$call_allowed
= 0;
$res
= authorize(
$op
,
$idpId
,
{
response_type
=>
"code"
,
client_id
=>
"rpid"
,
scope
=>
"openid"
,
}
);
expectPortalError(
$res
, 24 );
};
subtest
"Allowed request URI, bad redirect URI"
=>
sub
{
my
$idpId
= login(
$op
,
"french"
);
$res
= authorize(
$op
,
$idpId
,
{
response_type
=>
"code"
,
client_id
=>
"rpid"
,
scope
=>
"openid"
,
}
);
expectPortalError(
$res
, 108 );
};
subtest
"Allowed request URI, bad redirect URI override"
=>
sub
{
my
$idpId
= login(
$op
,
"french"
);
$res
= authorize(
$op
,
$idpId
,
{
response_type
=>
"code"
,
client_id
=>
"rpid"
,
scope
=>
"openid"
,
}
);
expectPortalError(
$res
, 108 );
};
subtest
"Undeclared request_uri is not called before auth"
=>
sub
{
local
$call_allowed
= 0;
$res
= authorize(
$op
,
undef
,
{
response_type
=>
"code"
,
client_id
=>
"rpid"
,
scope
=>
"openid"
,
}
);
ok(1);
};
clean_sessions();
done_testing();
sub
op {
return
LLNG::Manager::Test->new( {
ini
=> {
logLevel
=>
$debug
,
domain
=>
'idp.com'
,
authentication
=>
'Demo'
,
userDB
=>
'Same'
,
issuerDBOpenIDConnectActivation
=> 1,
oidcRPMetaDataExportedVars
=> {
rp
=> {
email
=>
"mail"
,
family_name
=>
"cn"
,
name
=>
"cn"
}
},
oidcServiceAllowHybridFlow
=> 1,
oidcServiceAllowImplicitFlow
=> 1,
oidcServiceAllowAuthorizationCodeFlow
=> 1,
oidcRPMetaDataOptions
=> {
rp
=> {
oidcRPMetaDataOptionsDisplayName
=>
"RP"
,
oidcRPMetaDataOptionsIDTokenExpiration
=> 3600,
oidcRPMetaDataOptionsClientID
=>
"rpid"
,
oidcRPMetaDataOptionsClientSecret
=>
"rpid"
,
oidcRPMetaDataOptionsIDTokenSignAlg
=>
"RS256"
,
oidcRPMetaDataOptionsBypassConsent
=> 0,
oidcRPMetaDataOptionsUserIDAttr
=>
""
,
oidcRPMetaDataOptionsAccessTokenExpiration
=> 3600,
oidcRPMetaDataOptionsBypassConsent
=> 1,
oidcRPMetaDataOptionsRequestUris
=>
oidcRPMetaDataOptionsRedirectUris
=>
oidcRPMetaDataOptionsPostLogoutRedirectUris
=>
}
},
oidcOPMetaDataOptions
=> {},
oidcOPMetaDataJSON
=> {},
oidcOPMetaDataJWKS
=> {},
oidcServiceMetaDataAuthnContext
=> {
'loa-4'
=> 4,
'loa-1'
=> 1,
'loa-5'
=> 5,
'loa-2'
=> 2,
'loa-3'
=> 3
},
oidcServicePrivateKeySig
=> oidc_key_op_private_sig,
oidcServicePublicKeySig
=> oidc_cert_op_public_sig,
}
}
);
}