{
  "info": {
    "name": "OAuth 2.1 Authorization Server",
    "description": "Collection for testing OAuth 2.1 flows",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "http://localhost:9000"
    },
    {
      "key": "client_id",
      "value": "public-client"
    },
    {
      "key": "confidential_client_id",
      "value": "confidential-client"
    },
    {
      "key": "confidential_client_secret",
      "value": "secret"
    },
    {
      "key": "redirect_uri",
      "value": "http://127.0.0.1:8080/authorized"
    },
    {
      "key": "authorization_code",
      "value": ""
    },
    {
      "key": "access_token",
      "value": ""
    },
    {
      "key": "refresh_token",
      "value": ""
    },
    {
      "key": "code_verifier",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "Well-Known Configuration",
      "request": {
        "method": "GET",
        "header": [],
        "url": {
          "raw": "{{base_url}}/.well-known/oauth-authorization-server",
          "host": ["{{base_url}}"],
          "path": [".well-known", "oauth-authorization-server"]
        }
      }
    },
    {
      "name": "JWK Set",
      "request": {
        "method": "GET",
        "header": [],
        "url": {
          "raw": "{{base_url}}/oauth2/jwks",
          "host": ["{{base_url}}"],
          "path": ["oauth2", "jwks"]
        }
      }
    },
    {
      "name": "Token - Authorization Code (Public Client)",
      "event": [
        {
          "listen": "test",
          "script": {
            "exec": [
              "if (pm.response.code === 200) {",
              "    const response = pm.response.json();",
              "    pm.collectionVariables.set('access_token', response.access_token);",
              "    pm.collectionVariables.set('refresh_token', response.refresh_token);",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/x-www-form-urlencoded"
          }
        ],
        "body": {
          "mode": "urlencoded",
          "urlencoded": [
            {
              "key": "grant_type",
              "value": "authorization_code"
            },
            {
              "key": "code",
              "value": "{{authorization_code}}"
            },
            {
              "key": "redirect_uri",
              "value": "{{redirect_uri}}"
            },
            {
              "key": "client_id",
              "value": "{{client_id}}"
            },
            {
              "key": "code_verifier",
              "value": "{{code_verifier}}"
            }
          ]
        },
        "url": {
          "raw": "{{base_url}}/oauth2/token",
          "host": ["{{base_url}}"],
          "path": ["oauth2", "token"]
        }
      }
    },
    {
      "name": "Token - Client Credentials",
      "event": [
        {
          "listen": "test",
          "script": {
            "exec": [
              "if (pm.response.code === 200) {",
              "    const response = pm.response.json();",
              "    pm.collectionVariables.set('access_token', response.access_token);",
              "}"
            ]
          }
        }
      ],
      "request": {
        "auth": {
          "type": "basic",
          "basic": [
            {
              "key": "username",
              "value": "{{confidential_client_id}}"
            },
            {
              "key": "password",
              "value": "{{confidential_client_secret}}"
            }
          ]
        },
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/x-www-form-urlencoded"
          }
        ],
        "body": {
          "mode": "urlencoded",
          "urlencoded": [
            {
              "key": "grant_type",
              "value": "client_credentials"
            },
            {
              "key": "scope",
              "value": "read write"
            }
          ]
        },
        "url": {
          "raw": "{{base_url}}/oauth2/token",
          "host": ["{{base_url}}"],
          "path": ["oauth2", "token"]
        }
      }
    },
    {
      "name": "Token - Refresh Token",
      "event": [
        {
          "listen": "test",
          "script": {
            "exec": [
              "if (pm.response.code === 200) {",
              "    const response = pm.response.json();",
              "    pm.collectionVariables.set('access_token', response.access_token);",
              "    pm.collectionVariables.set('refresh_token', response.refresh_token);",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/x-www-form-urlencoded"
          }
        ],
        "body": {
          "mode": "urlencoded",
          "urlencoded": [
            {
              "key": "grant_type",
              "value": "refresh_token"
            },
            {
              "key": "refresh_token",
              "value": "{{refresh_token}}"
            },
            {
              "key": "client_id",
              "value": "{{client_id}}"
            }
          ]
        },
        "url": {
          "raw": "{{base_url}}/oauth2/token",
          "host": ["{{base_url}}"],
          "path": ["oauth2", "token"]
        }
      }
    },
    {
      "name": "UserInfo",
      "request": {
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{access_token}}"
            }
          ]
        },
        "method": "GET",
        "header": [],
        "url": {
          "raw": "{{base_url}}/userinfo",
          "host": ["{{base_url}}"],
          "path": ["userinfo"]
        }
      }
    },
    {
      "name": "Token Introspection",
      "request": {
        "auth": {
          "type": "basic",
          "basic": [
            {
              "key": "username",
              "value": "{{confidential_client_id}}"
            },
            {
              "key": "password",
              "value": "{{confidential_client_secret}}"
            }
          ]
        },
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/x-www-form-urlencoded"
          }
        ],
        "body": {
          "mode": "urlencoded",
          "urlencoded": [
            {
              "key": "token",
              "value": "{{access_token}}"
            }
          ]
        },
        "url": {
          "raw": "{{base_url}}/oauth2/introspect",
          "host": ["{{base_url}}"],
          "path": ["oauth2", "introspect"]
        }
      }
    },
    {
      "name": "Token Revocation",
      "request": {
        "auth": {
          "type": "basic",
          "basic": [
            {
              "key": "username",
              "value": "{{confidential_client_id}}"
            },
            {
              "key": "password",
              "value": "{{confidential_client_secret}}"
            }
          ]
        },
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/x-www-form-urlencoded"
          }
        ],
        "body": {
          "mode": "urlencoded",
          "urlencoded": [
            {
              "key": "token",
              "value": "{{access_token}}"
            }
          ]
        },
        "url": {
          "raw": "{{base_url}}/oauth2/revoke",
          "host": ["{{base_url}}"],
          "path": ["oauth2", "revoke"]
        }
      }
    },
    {
      "name": "Home",
      "request": {
        "method": "GET",
        "header": [],
        "url": {
          "raw": "{{base_url}}/",
          "host": ["{{base_url}}"],
          "path": [""]
        }
      }
    }
  ]
}
