|
1 | 1 | // Copyright © 2022 Ory Corp |
2 | 2 | // SPDX-License-Identifier: Apache-2.0 |
3 | 3 |
|
4 | | -import { createClient, prng } from "../../helpers" |
| 4 | +import { createClient, prng, rotateJwks, validateJwt } from "../../helpers" |
5 | 5 |
|
6 | 6 | const accessTokenStrategies = ["opaque", "jwt"] |
7 | 7 |
|
@@ -100,6 +100,61 @@ describe("The OAuth 2.0 Refresh Token Grant", function () { |
100 | 100 | }) |
101 | 101 | }) |
102 | 102 | }) |
| 103 | + |
| 104 | + const validateJwtAndGetKid = (token) => |
| 105 | + validateJwt(token).then(({ header }) => header.kid) |
| 106 | + |
| 107 | + it("should refresh the Access and ID Token with newly rotated keys", function () { |
| 108 | + if ( |
| 109 | + accessTokenStrategy === "opaque" || |
| 110 | + (Cypress.env("jwt_enabled") !== "true" && |
| 111 | + !Boolean(Cypress.env("jwt_enabled"))) |
| 112 | + ) { |
| 113 | + this.skip() |
| 114 | + } |
| 115 | + |
| 116 | + const referrer = `${Cypress.env("client_url")}/empty` |
| 117 | + cy.visit(referrer, { |
| 118 | + failOnStatusCode: false, |
| 119 | + }) |
| 120 | + |
| 121 | + createClient({ |
| 122 | + scope: "offline_access openid", |
| 123 | + redirect_uris: [referrer], |
| 124 | + grant_types: ["authorization_code", "refresh_token"], |
| 125 | + response_types: ["code"], |
| 126 | + token_endpoint_auth_method: "none", |
| 127 | + }).then((client) => { |
| 128 | + cy.authCodeFlowBrowser(client, { |
| 129 | + consent: { |
| 130 | + scope: ["offline_access", "openid"], |
| 131 | + }, |
| 132 | + createClient: false, |
| 133 | + }).then(({ body: tokensBefore }) => { |
| 134 | + const kidsBefore = { |
| 135 | + accessToken: validateJwtAndGetKid(tokensBefore.access_token), |
| 136 | + idToken: validateJwtAndGetKid(tokensBefore.id_token), |
| 137 | + } |
| 138 | + |
| 139 | + rotateJwks("hydra.jwt.access-token") |
| 140 | + rotateJwks("hydra.openid.id-token") |
| 141 | + |
| 142 | + cy.refreshTokenBrowser(client, tokensBefore.refresh_token).then( |
| 143 | + ({ body: tokensAfter }) => { |
| 144 | + const kidsAfter = { |
| 145 | + accessToken: validateJwtAndGetKid(tokensAfter.access_token), |
| 146 | + idToken: validateJwtAndGetKid(tokensAfter.id_token), |
| 147 | + } |
| 148 | + |
| 149 | + expect(kidsAfter.accessToken).to.not.equal( |
| 150 | + kidsBefore.accessToken, |
| 151 | + ) |
| 152 | + expect(kidsAfter.idToken).to.not.equal(kidsBefore.idToken) |
| 153 | + }, |
| 154 | + ) |
| 155 | + }) |
| 156 | + }) |
| 157 | + }) |
103 | 158 | }) |
104 | 159 | }) |
105 | 160 | }) |
0 commit comments