Fixed error handling for token exchange when openid scope missing
Signed-off-by: Margo Crawford <margaretc@vmware.com>
This commit is contained in:
parent
0abadddb1a
commit
5b7c510577
@ -753,7 +753,7 @@ func TestTokenExchange(t *testing.T) {
|
||||
wantResponseBodyContains: `invalid subject_token`,
|
||||
},
|
||||
{
|
||||
name: "access token missing required scopes",
|
||||
name: "access token missing pinniped.sts.unrestricted scope",
|
||||
authcodeExchange: authcodeExchangeInputs{
|
||||
modifyAuthRequest: func(authRequest *http.Request) {
|
||||
authRequest.Form.Set("scope", "openid")
|
||||
@ -769,6 +769,23 @@ func TestTokenExchange(t *testing.T) {
|
||||
wantStatus: http.StatusForbidden,
|
||||
wantResponseBodyContains: `missing the \"pinniped.sts.unrestricted\" scope`,
|
||||
},
|
||||
{
|
||||
name: "access token missing openid scope",
|
||||
authcodeExchange: authcodeExchangeInputs{
|
||||
modifyAuthRequest: func(authRequest *http.Request) {
|
||||
authRequest.Form.Set("scope", "pinniped.sts.unrestricted")
|
||||
},
|
||||
want: tokenEndpointResponseExpectedValues{
|
||||
wantStatus: http.StatusOK,
|
||||
wantSuccessBodyFields: []string{"access_token", "token_type", "expires_in", "scope"},
|
||||
wantRequestedScopes: []string{"pinniped.sts.unrestricted"},
|
||||
wantGrantedScopes: []string{"pinniped.sts.unrestricted"},
|
||||
},
|
||||
},
|
||||
requestedAudience: "some-workload-cluster",
|
||||
wantStatus: http.StatusForbidden,
|
||||
wantResponseBodyContains: `missing the \"openid\" scope`,
|
||||
},
|
||||
{
|
||||
name: "token minting failure",
|
||||
authcodeExchange: authcodeExchangeInputs{
|
||||
|
@ -66,9 +66,12 @@ func (t *TokenExchangeHandler) PopulateTokenEndpointResponse(ctx context.Context
|
||||
}
|
||||
|
||||
// Require that the incoming access token has the STS and OpenID scopes.
|
||||
if !originalRequester.GetGrantedScopes().Has(pinnipedTokenExchangeScope, oidc.ScopeOpenID) {
|
||||
if !originalRequester.GetGrantedScopes().Has(pinnipedTokenExchangeScope) {
|
||||
return errors.WithStack(fosite.ErrAccessDenied.WithHintf("missing the %q scope", pinnipedTokenExchangeScope))
|
||||
}
|
||||
if !originalRequester.GetGrantedScopes().Has(oidc.ScopeOpenID) {
|
||||
return errors.WithStack(fosite.ErrAccessDenied.WithHintf("missing the %q scope", oidc.ScopeOpenID))
|
||||
}
|
||||
|
||||
// Use the original authorize request information, along with the requested audience, to mint a new JWT.
|
||||
responseToken, err := t.mintJWT(ctx, originalRequester, params.requestedAudience)
|
||||
|
Loading…
Reference in New Issue
Block a user