mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-10-11 12:19:04 +02:00
fix: re-check api permissions on access token refresh
This commit is contained in:
@@ -551,7 +551,7 @@ func TestTokenHandlerRefreshGrantPreservesAudienceAndScope(t *testing.T) {
|
||||
Secret: []byte(secret),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
handler := newTokenHandler(provider, newClaimsService(db, nil, baseURL, nil), nil)
|
||||
handler := newTokenHandler(provider, newClaimsService(db, nil, baseURL, nil), apiAccess)
|
||||
|
||||
form := url.Values{
|
||||
"grant_type": {"refresh_token"},
|
||||
@@ -637,4 +637,47 @@ func TestTokenHandlerRefreshGrantPreservesAudienceAndScope(t *testing.T) {
|
||||
require.Empty(t, body["access_token"])
|
||||
require.Equal(t, "invalid_scope", body["error"])
|
||||
})
|
||||
|
||||
t.Run("revoking only the user-delegated API grant makes the next refresh fail", func(t *testing.T) {
|
||||
db := testutils.NewDatabaseForTest(t)
|
||||
const clientID, userID = "client-user-revoked", "user-user-revoked"
|
||||
seedUserAndClient(t, db, clientID, userID)
|
||||
|
||||
clientOnlyAPI := fakeAPIAccess{allowed: map[string]map[SubjectType][]string{
|
||||
apiResource: {
|
||||
SubjectTypeClient: {"read:orders"},
|
||||
},
|
||||
}}
|
||||
|
||||
token := mintRefreshToken(t, db, clientID, userID,
|
||||
fosite.Arguments{"openid", "read:orders"},
|
||||
fosite.Arguments{apiResource},
|
||||
)
|
||||
body := doRefresh(t, db, clientOnlyAPI, clientID, token, nil)
|
||||
require.Empty(t, body["access_token"])
|
||||
require.Equal(t, "access_denied", body["error"])
|
||||
})
|
||||
|
||||
t.Run("refresh rechecks the granted scope against the granted API audience", func(t *testing.T) {
|
||||
db := testutils.NewDatabaseForTest(t)
|
||||
const clientID, userID = "client-split-grant", "user-split-grant"
|
||||
seedUserAndClient(t, db, clientID, userID)
|
||||
|
||||
splitGrantAPI := fakeAPIAccess{allowed: map[string]map[SubjectType][]string{
|
||||
apiResource: {
|
||||
SubjectTypeUser: {"write:orders"},
|
||||
},
|
||||
"https://api.inventory.example.com": {
|
||||
SubjectTypeUser: {"read:orders"},
|
||||
},
|
||||
}}
|
||||
|
||||
token := mintRefreshToken(t, db, clientID, userID,
|
||||
fosite.Arguments{"openid", "read:orders"},
|
||||
fosite.Arguments{apiResource},
|
||||
)
|
||||
body := doRefresh(t, db, splitGrantAPI, clientID, token, nil)
|
||||
require.Empty(t, body["access_token"])
|
||||
require.Equal(t, "invalid_scope", body["error"])
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user