flat-waitress-75076
09/20/2024, 2:10 PMbrief-egg-61061
09/20/2024, 2:10 PMbrief-egg-61061
09/20/2024, 2:10 PMhydra create client
command. Here is an example of how to create a client with the client_credentials
grant type: bash hydra create client \ --endpoint <http://127.0.0.1:4445> \ --grant-type client_credentials \ --token-endpoint-auth-method client_secret_post
This command will output the client details including the client_id
and client_secret
which you will need for the next step. To perform the client credentials grant and get a token, you can use the hydra perform client-credentials
command. Replace {INSERT-CLIENT-ID_HERE}
and {INSERT-CLIENT-SECRET-HERE}
with your actual client_id
and `client_secret`: bash docker run --rm -it --network hydraguide oryd/hydra:v2.0.1 \ perform client-credentials \ --client-id {INSERT-CLIENT-ID_HERE} \ --client-secret "{INSERT-CLIENT-SECRET-HERE}" \ --endpoint <http://ory-hydra-example--hydra:4444>
This command will output an access token. Sources: - [5 minute tutorial Part 3](https://www.ory.sh/docs/hydra/5min-tutorial) - [Performing the OAuth2 Client Credentials Flow](https://www.ory.sh/run-oauth2-server-open-source-api-security/#performing-the-oauth2-client-credentials-flow) - [hydra create client](https://www.ory.sh/docs/hydra/cli/hydra-create-client)flat-waitress-75076
09/20/2024, 2:13 PMflat-waitress-75076
09/20/2024, 2:13 PMbrief-egg-61061
09/20/2024, 2:13 PMbrief-egg-61061
09/20/2024, 2:13 PMjwks_uri
parameter when creating or updating a client. The jwks_uri
parameter should point to the URL of the client's JWK Set document. This JWK Set contains the signing key(s) the server uses to validate signatures from the client and may also contain the client's encryption keys, which are used by the server to encrypt responses to the client. Here is an example of how to create a client with a specific `jwks_uri`: bash hydra create client \ --endpoint <http://127.0.0.1:4445> \ --grant-type client_credentials \ --token-endpoint-auth-method client_secret_post \ --jwks-uri "<http://your-jwks-url>"
Replace "<http://your-jwks-url>"
with the actual URL of your JWK Set. Please note that the JWK Set at the specified URL should be in the correct format and contain the necessary keys for signing and/or encryption. You can use the Ory CLI to create and manage JWK Sets. Sources: - [Hydra API Reference - setOidcDynamicClient](https://www.ory.sh/docs/hydra/reference/api) - [Ory CLI - ory create jwk](https://www.ory.sh/docs/cli/ory-create-jwk)flat-waitress-75076
09/20/2024, 2:16 PMbrief-egg-61061
09/20/2024, 2:16 PMbrief-egg-61061
09/20/2024, 2:16 PMjwks_uri
if it points to a valid JSON Web Key Set (JWK Set) that is accessible by the Hydra server. The URL hydra:4445/admin/keys/sandbox_key
suggests that you have a JWK Set named sandbox_key
stored in Hydra. When creating or updating a client, you can specify this `jwks_uri`: bash hydra create client \ --endpoint <http://127.0.0.1:4445> \ --grant-type client_credentials \ --token-endpoint-auth-method client_secret_post \ --jwks-uri "<http://hydra:4445/admin/keys/sandbox_key>"
Please ensure that the Hydra server can reach the specified jwks_uri
. Source: - [Hydra API Reference - getJsonWebKeySet](https://www.ory.sh/docs/hydra/reference/api)flat-waitress-75076
09/20/2024, 2:18 PMbrief-egg-61061
09/20/2024, 2:18 PMbrief-egg-61061
09/20/2024, 2:18 PMclient_credentials
grant type when making a request to the /oauth2/token
endpoint. This is part of the OAuth 2.0 Client Credentials Grant flow, where the client authenticates with the authorization server and requests an access token. Here's an example of how to make a request to the /oauth2/token
endpoint using `client_credentials`: bash curl -X POST \ <https://your-ory-hydra-instance.com/oauth2/token> \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&scope=YOUR_SCOPE'
Replace <https://your-ory-hydra-instance.com/oauth2/token>
, YOUR_CLIENT_ID
, YOUR_CLIENT_SECRET
, and YOUR_SCOPE
with your actual Hydra instance URL, client ID, client secret, and the scope you want to request, respectively. Please note that the client must be configured to allow the client_credentials
grant type and the appropriate client authentication method (client_secret_basic
or client_secret_post
). Sources: - [OAuth2 Client Credentials Flow - Basic Authentication](https://www.ory.sh/docs/oauth2-oidc/client-credentials#basic-authentication) - [OAuth2 Client Credentials Flow - Body Authentication](https://www.ory.sh/docs/oauth2-oidc/client-credentials#body-authentication) - [Hydra Debug - Client auth fails because Wrong token_endpoint_auth_method](https://www.ory.sh/docs/hydra/debug/token-endpoint-auth-method)flat-waitress-75076
09/20/2024, 2:24 PMbrief-egg-61061
09/20/2024, 2:24 PMbrief-egg-61061
09/20/2024, 2:25 PMjwks_uri
. If the first key found is a symmetric key (using the HS256
algorithm), that key will be used. This key won't be broadcasted at /.well-known/jwks.json
. You must manually configure the upstream to be able to fetch the key (for example from an environment variable). If the first key found is an asymmetric private key (for example RS256
, ES256
, ...), that key will be used. The related public key will be broadcasted at /.well-known/jwks.json
. So, if you want to use a specific key to sign your JWT tokens, you should make sure that key is the first one in your JWKS. Source: - [Oathkeeper Pipeline Mutators - id_token configuration](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#id_token-configuration)flat-waitress-75076
09/20/2024, 2:27 PM{
"keys": [
{
"use": "sig",
"kty": "RSA",
"kid": "sig:156fb5a9-2c3d-4448-ae73-7121269da390",
"alg": "RS256",
"n": "zMNXubxh763CmuFn-ZVLisiqlLQq7hsalcI0aTB7jtdPGsBF1nj2diAqBQbyO7G7zuT7uxPNfWHG5kGgo4uCpseFxrcU8vkr6j3JfgjtcofZN7N5GQs1xwGoOwFn-Fh4OuywM2v-SbZTFk3uDi_wlqDNDs_dLl0X514RXHy8q9IhGatLUxfNhf-Cjr5K6orqYqy2XC6tFkRPqmt0rMKPlxQffjssMcUgHgG5pII1DuQURdabQu2SGLjgwTGq1e2wUd9QlALGDxxX_swwLNseqG9Ab8bxhkR-nvqGePT3C_xdK2BoJS8BnkBvGEmcqfKf5bAliLt__fhFBfN0AoLDEr-aamMHCusrPl3u4Ht7CKfG91TLl4zdsl3DmpY1ct6KXh4E6tqYgTdTQmZxcnMZ7u7Pb8z9nvN6i2NffTbsIoWFS_agod00gbavoY2OFNag_m8fm1zmJuN0fOmhy7Rz30vBU1fKa-FSaryvTixEvvQke6w3BC69mzfVQceQLU-Ap_oneQqFLTKb8eTke08bI0BFdWBFTIIGEenvf78T0jxmpBya7uRZ2R8dZYcYOXpIYISJIwV0IcXQGlJbA113bq2J-_4j9BFLtsPj7l5hUOpDZ_G3zD4hafIfN94IxgGDBJT5wz3xPPJ-Eqv38NFHE5bL1cBZiRRli2QDjyiZuLM",
"e": "AQAB",
"d": "coypa--2PjZP0wNcfmSF4TsHKq9sAM5K3hLJ7TrBNJTA3S9JIoWDI2w09aEALGLutPym0u5uG8FyWufF7Rgj3BdsgFF1t8OrTJyKNybZZyQWYbHWgisiR5VmvrO3rVgY0qYMoIe-tw_3hVfNYERzbGDCtpGUo9ZShA282qexiNHB0LFiLzb2tArPx_kuwe062D7Uudcm33kRtD3vBKLHX3ZTc_O4cpNbt02xxBVPh2gS60r2iseK3qe2nH2jm5Af_n1Wf6bZlCSAGbuzC7T9fq7WNnHuNfXlfByc09f-yMbCfHyvZnXYiuZy__xWV0CzMPSM2uRB4xtbyct7T9hFNhyp8St0SmluPV_jm3g0KInaqaXsqDI-9AoRQmifGxHvLItRfqU-ZWnpEa1e4EXSJBAmTLVlJ4zHYz18I0QIuwp1rvxu5z-kb_uhTMLIUjL0B991rw8YvVWygKaOA_gN7erXWzhIFqllsncBQyVbaCaBOSFxnPsiTXluFQR36j342Zik66Tolk9640lRNPCXHe-ir-6tPbX-F4uDh11jWc9Xr4pv9eWbBgstRUc4a_ZiVucxTNUNrEPsMZgYweA8WCjoQWRq_4WSc53cvnRo8pDQypNVXDsDzJ7sIUyQQWmALIzP7hOXv1_PENHdAFWJLyCqTIR2QIF-qfsUmh29nME",
"p": "51XEs52fNRkv91YsThVKRZjWlcDFNpl8kcu_1Y3P94gRp6lXl8gKFvJNge-vhtLD5a9x4EZVKqp4IYzrBmoGF_fyzfSxH-EvM9B8m7ravK8PkLAfwZ1EF1gNG5Nrfrdv2jb4OEsf_daaRlqzCrEI4dAR-sXEDZNnOkW13ZDwxwGDqr6pwlemEzq660hMXAkoZ2Wom-3XJo4CM_3bxh17mRcLfyUZ-g3nAcadqfWvbMxxb3zqW34WJHg6hd3dB6ZOvRSREniyNFuSUQmjiRWGJLAjtCoVS_oiKv9wcnNKXPz6FlqZz3x3n_Ge5iV8KLUKdC1YElm1Vfb0gZOeicdroQ",
"q": "4phMhc6HTROtdGFPG1KCNw_OaxUVyCLjOKt_UwaWNTfryv4WKf-HpuaI978waTMGPFpomw5v-Obds71aWV61i9SLvxNo143TDxJWX4_Plo93g2hSd5WifgUOjVEMV6ho3-PmOWoI-o7wvMzJumgNkCqBn-IVwut7XFLUl1o4fbjT0bwGetzApqvt5s1_xgaPTd5w-OXX26fIelOghElROL2EB550IjMBtIWxbPEi_flNkN_P9zDynV3zzwOa80Vm33ehB8chxHUhTB5APVjCP26AOfN3hzAkzCAXdoWKxLyhRKgQuULVAh72RP0ql1dJghL41P3GRPaDxKcbf2Uj0w",
"dp": "kHHMbX64_zWn7p8-8M54XraNHlqMiYgS8RIwyQ5QUbYDmBWz3NEKA8Ptw3k-t0d5DDydNTWVThu9AO31fj7LaUHnuNPVmRtJFuhSNgbZN8FzTZu7aHBjKNRQ8uv8zdWKIM379WJrKltKXy2Y588cxare3x-HSBbG-Oq4IQ20Wf5HEWEVrIR_7TfZqLmu_DS3psAiJKLAmZFILOCQzsZv-2oZQp2O98Sgfkpe_dWrYJrTJZLw3on_F2x-1kFvFqywM33ZC5iTZP_cf38uPpVS-iuFT6SLQbKAjSqMMtpsD13iZfzSV2zXYOZEml3DhcNtMJdzi5m6EWAu0Y20C0GaoQ",
"dq": "aiG7ddDOPqPA0onha4Kxyuh0XmN52Eu-8YQiFtk28aZHosRvzSwKdXn1HVVHb36epRYTeMzCVWqM3OsLrmBV2DCtY8nLiWq8OIr2Obw6FuMLr1jlh21mtm_X6QjVJxmSRYuRAcNQgUsCJuwkcFLcR3IhVKmoV6vEE_IX8OwpGXnAfLP8tP9AnNBalYgbGL1p0acmcu30tMVZeTJCNLPCfzkE5iypaHtLiSo1eDlZkmt6kSjDV5xthpfC4mtl4BvZm0GFAweaIVJbTjO9Ev7HvL4dAQewLHm4QoOlebYC0TMoteeiLaPH8T5fSuDpWglgPLR2KAzVGOf9v9YlYv4UUQ",
"qi": "WhNqVyk3HpywRZVfsXuoXgBkpHYSrzM75JW_AvzTM55QF-AzY5o_F14IYhXV0itfNxKhy_hdweAUoGfsgTiQ3q_GS_kYygBBk1Jzac7Tg4g6nQxK4sXfcXDCXJ8n0-r3p7yem6ystP1zYKNZGGK3_BZ_k82eBrtdRwt24UIxd6hTNm7MTm3L79cO2sbnn5Mh6bniioVU3-MWeQm1yJ9rMwcT5RZF8_58F3AFUbuel_JLg6_95r25clWKYuEbTs2de0kMM6PxzzLnuI1Am7Zdg0VS2HFTr7vn8LoXRcMg3qClUvmUvWPKLPDEpRGlTb08El7NMppFn36CHGKh5r5SMw"
},
{
"use": "enc",
"kty": "RSA",
"kid": "enc:156fb5a9-2c3d-4448-ae73-7121269da390",
"alg": "RS256",
"n": "xYmDbvdoHzCsDeuvefycg2PnOscbDroaq0rTRyjj0u9AHI1lSrl1cMDEy9ojrYB9PwffiCjX3jWhOryemJYHNMOnkqt0GL6gPaXBZsYwlwbs1YNct9y2NfcpFKR219iWZQxG4DJByMk5OyVkZ3N3sxtllOuG7VfxnYs-ueRluF_f2hMlG5U0Jpe7PbuZ8BVjSsfpvWuJY80ifNkGbYUVxQU8hc6j62E_hDA8ARCg0FpCkR_PFFzG6wT0xOBW_zbIRypfYoC6rt0g3Z_aizHk2anQqPmMApj1b1pulT4yu6IHHgSdc0VscTLiMm4_4z0fnzSPjYlRd6e-rO8Mx6sS3UziosxlUpTqwORoK89iS2HAOGWaA-ShQ1DwuubAqlumDKvuIhej9myapl2_46xLnqPavc7zBvXZlHv_cSOM5V9xrv2JG7VqB7ZgBiwdfZ2PoK0J9T6I_Qw77PAXTvZQKOBc2pn4ivjQdfvz60gBtg8-zaCI9dDH01s6-aQfaGcl5FdSAA1aKMvGHlP-J7qFAol8egLhq3W4ZW8vLA4GqtPaizX-XBY6NCXKugHiKZWm9-PSa7mEHf9ZnAloNlJj-5SZc1Enn_dOav34vMb8aGowDrMJ2PGpe-x2899EnSUEn-PG5tcV8O9KHHXCdWq1MEwJa8Ykcni3egZNtR9oxaU",
"e": "AQAB",
"d": "rlivs5oTwSuhP-wcBavKrEDZzkv7eqURcsvo7C6P3hWiXVEC7NABcpIBX_bZdIIqiR420aNS2-IzunbN99i65Xwmg9Jl9o0ROzf4GfCk5DeNgumdRP49qCXMkVaTOfEE1IzgZXKWE1Re-fAHzTLhnCh7INQ8U3FCZI2IwGNw0Cl2lrA9GTo4PDPBZDwXIwqNh2woxjGKopZkcRLPlIxY6Xq0r1jx3ocHm3FDFKGLfjmb9SDBEbTNMJNAQh_LSRgd7onchEEgA8RSBKnZJu_Tj7VM4EbYp1Y_kZeccIbkGi1o4LqsCRhmHQcPE_mw06yYI1kttntTdyuLpHCctAIu86uUGF5TJAhd84yR_fLhoalOpJo9K452TiEKzL_xkuBHEnDtZ797HB_WDIs_OHpsx-YI03dxpjz2PV3ps2yMXmeXkbpV5dILtDnDytgnApE_ZCQ8dI9kHVQnAiX7HqnNwIEZN_Frksw_ZqG7DY7lTSOFNKMd0XUgHjYzrXyaxekJAGde6ef2K0k1z6FyjGjWZOKWNGObBg_GfCO9u9DSCLnKcKd8do6rlgxlr3zDBnGQFbLTCHM6k-iAI_1Ntq8N8KCHBjr0DYwvlbeRnPQKPFBshLAYiL6Mvgz_tO_aluqfGh2flPRCDukGuut4zmVjcxMaJu-5FqRiK_GAVAaShkE",
"p": "0GjKhkF-81t3hGYj1hmAiaDhErNEzQ0_7FnZpC9VeeVkPSOKqEs938-e5snj4qAOP677ZTerz94QGPatQO1Z9VJrHlTf6TGlFItW-gIbRH5KJVpjcCRv76z91a9aQj9r58jZMVnrwI1aL9JXF8QWUm7Onw8MIChCxYqZr7qfLS30l6Nw1vYpnDwjR9Oyx2NU0kyNiR7DCEVHgHWyYMsi_oPaSAgbNPG7mG0RSLvCOXOw5H9Tamh17yKthLU9q2Z9CHFAAQzrIJykxhQo_N4DF7PAfsklIkpppDCpv4HkELkgoJm2BHR_QCd0u_Ha12R8VDUBkQBcGPVfBEUmYDJU9Q",
"q": "8qUn2hmjEJkXD38NcdAzbzMDmhzw4ji_LCpepvTB4ob9ycpWFsLLjxSXudOZTl8Ur_RlLI7tV5xqJ5UgiIUTAdMQrw7F7SZtwIYBM30LZeXyLWE0Ct9WMOJpXp6Motajwg7q-v7PjM1o_Jllg7PbvRFR4H9t41Xvph9STMZ16F3R_z9y_EVh9Vt60YYH-OLMZSaSenaWQU356P-FARRYyKLMl0hbE1jH9-ZaoOT-jQKDVHSdUxCGaxNS_qXu2supWfvMOBNW9meN8-p84h1L7_7CUygs6qHJi78eLHSylfKmoF8SMDNFxpEnWLbweFGXLQ2XXUKvghXZOYXHMZS_8Q",
"dp": "Bk2FAnZsnnN_s9Na9hijWIYzCFu_kuv5qO42tM5xqVQUqfyvLtPHtUMULSqh57Kre6WRGMiMO6cdmYOsTbBf7hll_-7VLro_odVs9famWHXxTBvlsfiIIhl7O8En26ULYGEkoGd1x8b-mT-lPqTBgBC10v2jgj11d3_vke707WrcYNGikf2z2HPBJWTznTAV2p5SEXmKsG9X8Dye_mpmTogyS8di-0DsSXnS8f4rq40iJmbrYOZz2p2T3dWVXd-lnGHAa8e2PLBAE3V8n9kfAtJ-2da_dsAFXd_S4mXNPew7XmAHry7OwmPvFdgEpEr3r5xCxd3a6y5Qh1KIDJS5GQ",
"dq": "g742QA3RYo6sXaaPJy9y7bpWB1QVWc6TxagPkjisGJFQtEJesab8HOiCZMvFni6zrcFVOXc02G-9l1Y5vsX6BvCRS2sK_fLyfiiD-G-5Q48xCYCQYCLYylvz-AK_ux4s9Y1h-ftltz5D9XpYCsUZ1rLTsL-fa2JaZuj0p2jN1ecywJKznNMTF8OekKpkI7cIYRcrSsCeXkC3ItGxZl-kwPLbgHwxrvRyRl_U7yzGJMurgKx8SwBa60InuslfQX54qbm0LPIbMlgRU9EKEz7y3xCEc-AJWy-SnYScHmkSGaYQ4FweJPuBtAlVwq45LCqomTaa63DsmAXC1p-TApGQEQ",
"qi": "lbi5C7L8c4BcdlP3NT4CbQgkpPA79AmTAF5-8sdl8ITSMsMGKuGvh3E9xf7_7AcFWp6Fs7vZkl485TiKzMZ6D4EP5sybnY6-0dXSMaCR7uC_N5_N-EDuV8-N2wZkzV59rhDbWuyoQbK6LwjPQmY-eLfoyzyECmpaIcumy6JSmIOul8x1D3Ni57ZDpKdRkha7YyaS_cprGmXCoao-QxhbkqvOn0ySTLHodBIwZx51BaTjrpPLy6dnPmE0qvNmwHO4-QOjOEKvho9uMAAjZt6oqtRyClEQkPrDuDnFgW1cFyvm2xM_8dE8Mv8w7MhxrZb-TlcAu6PArG3wKVT5ra20gw"
},
brief-egg-61061
09/20/2024, 2:27 PMbrief-egg-61061
09/20/2024, 2:27 PMflat-waitress-75076
09/20/2024, 2:28 PMbrief-egg-61061
09/20/2024, 2:28 PMbrief-egg-61061
09/20/2024, 2:28 PMjwks_uri
, there could be a few reasons: 1. The jwks_uri
is not accessible: Ensure that the URL is correct and the server hosting the JWKS is accessible from the Ory Hydra or Oathkeeper instance. 2. The JWKS at the jwks_uri
is not in the correct format: The JWKS should be a valid JSON object containing an array of keys. Each key should have the necessary properties like kty
, alg
, use
, kid
, n
, and e
for RSA keys. 3. The client is not configured to use private_key_jwt
or client_secret_jwt
authentication: If you want to use a JWKS for client authentication, the client should be configured with token_endpoint_auth_method
set to private_key_jwt
or client_secret_jwt
. 4. The keys in the JWKS are not suitable for the operation: For example, if the keys are RSA keys but they don't have the private key part, they cannot be used for signing. If you've checked all these points and it's still not working, you might want to look at the logs of your Ory Hydra or Oathkeeper instance to see if there are any error messages related to JWKS or client authentication. Sources: - [Hydra API Reference - setOidcDynamicClient](https://www.ory.sh/docs/hydra/reference/api) - [Ory Oathkeeper - Mutator ID Token](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#id_token-configuration) - [Ory Hydra - JSON Web Key Set](https://www.ory.sh/docs/hydra/concepts/jwk)flat-waitress-75076
09/20/2024, 2:30 PMflat-waitress-75076
09/20/2024, 2:30 PMbrief-egg-61061
09/20/2024, 2:30 PMbrief-egg-61061
09/20/2024, 2:31 PMflat-waitress-75076
09/20/2024, 2:32 PMbrief-egg-61061
09/20/2024, 2:32 PMbrief-egg-61061
09/20/2024, 2:37 PMflat-waitress-75076
09/20/2024, 2:38 PMbrief-egg-61061
09/20/2024, 2:38 PMbrief-egg-61061
09/20/2024, 2:38 PMjwks_uri
parameter in the client configuration is used to specify the location of the JSON Web Key Set (JWKS) for the client. This JWKS contains the keys that the client uses for signing requests and that the server uses for validating signatures from the client and for encrypting responses to the client. When you specify a jwks_uri
, Ory Hydra will fetch the JWKS from that URL and use the keys it finds there for the client. This allows you to manage the keys for the client outside of Hydra, which can be useful in some scenarios. However, if you're storing the keys in Hydra itself, you don't necessarily need to provide a jwks_uri
. Instead, you can use the jwks
parameter to directly provide the keys in the client configuration. The jwks
parameter should contain a JWKS object with the keys for the client. Here's an example of how to create a client with a specific JWKS: bash hydra create client \ --endpoint <http://127.0.0.1:4445> \ --grant-type client_credentials \ --token-endpoint-auth-method client_secret_post \ --jwks '{"keys": [{"kty": "RSA", "use": "sig", "kid": "my-key", ...}]}'
Replace the ...
with the rest of your key parameters. Please note that if you provide both jwks_uri
and jwks
, the jwks_uri
will take precedence. Sources: - [Hydra API Reference - setOidcDynamicClient](https://www.ory.sh/docs/hydra/reference/api) - [Ory Hydra - JSON Web Key Set](https://www.ory.sh/docs/hydra/concepts/jwk)flat-waitress-75076
09/20/2024, 2:40 PMbrief-egg-61061
09/20/2024, 2:40 PMbrief-egg-61061
09/20/2024, 2:41 PM/.well-known/jwks.json
endpoint to sign the tokens. This is because Ory Hydra rotates the JSON Web Token Signing Keys and always takes the latest key from the key store to sign JSON Web Tokens. All public keys will be shown at <http://ory-hydra-public-api/.well-known/jwks.json>
. If you want to use a specific key to sign your tokens, you would need to manage the key rotation process to ensure that the key you want to use is the most recent one. However, this might not be practical or desirable in most cases. If you need to use different keys for different clients, you might want to consider using a different approach or a different OAuth2 server that supports this feature. Sources: - [Hydra - Secrets and key rotation](https://www.ory.sh/docs/hydra/self-hosted/secrets-key-rotation) - [Hydra - Cryptographic key management and JSON Web Key Sets (JWKS)](https://www.ory.sh/docs/hydra/jwks)flat-waitress-75076
09/20/2024, 2:42 PMbrief-egg-61061
09/20/2024, 2:42 PMbrief-egg-61061
09/20/2024, 2:42 PMflat-waitress-75076
09/20/2024, 2:44 PMbrief-egg-61061
09/20/2024, 2:44 PMbrief-egg-61061
09/20/2024, 2:44 PMprivate_key_jwt
method is used for client authentication in OAuth 2.0. This method involves the client creating a JSON Web Token (JWT) and signing it with its private key. The signed JWT is then sent to the authorization server (in this case, Ory Hydra) as a proof of the client's identity. Here's an example of how to use private_key_jwt
for client authentication: 1. First, you need to create an OAuth 2.0 client with private_key_jwt
as the token_endpoint_auth_method
. You also need to provide the public key of the RSA/ECDSA signing key using the jwks_uri
or jwks
fields of the client. Here's an example command using the Ory CLI: bash ory create oauth2-client --project "$PROJECT_ID" \ --name "Client Credentials Demo" \ --grant-type client_credentials \ --token-endpoint-auth-method private_key_jwt \ --jwks-uri <https://example.org/path/to/clients/public_key_set.jwks>
2. When you want to authenticate the client at the token endpoint, you need to generate and sign a JWT with the following claims using the RSA/ECDSA private key: - `iss`: The client_id
of the OAuth Client. - `sub`: The client_id
of the OAuth Client. - `aud`: The URL of the Authorization Server's Token Endpoint. - `jti`: A unique identifier for the token. - `exp`: The expiration time of the token. 3. Include the signed JWT in the client_assertion
parameter in the request to the /oauth2/token
endpoint. Sources: - [Ory Hydra - JWTs for client authentication](https://www.ory.sh/docs/hydra/guides/jwt#jwts-for-client-authentication) - [Ory Hydra - Registering the client's public key](https://www.ory.sh/docs/hydra/guides/jwt#registering-the-clients-public-key)flat-waitress-75076
09/20/2024, 2:47 PMbrief-egg-61061
09/20/2024, 2:47 PMbrief-egg-61061
09/20/2024, 2:47 PMprivate_key_jwt
method for client authentication, the JWT should be sent to the Ory Hydra's token endpoint. This is the endpoint where the OAuth 2.0 client sends a request to get an access token. The aud
(audience) claim in the JWT should be the URL of the Ory Hydra's token endpoint. The Ory Hydra server will verify that it's an intended audience for the token. Here's an example of how to make a request to the Ory Hydra's token endpoint (/oauth2/token
): javascript const requestOptions = { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: qs.toString(), redirect: "follow" }; fetch("<https://your-ory-hydra-instance/oauth2/token>", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
In this example, replace "<https://your-ory-hydra-instance/oauth2/token>"
with the actual URL of your Ory Hydra's token endpoint. Sources: - [Ory Hydra - JWTs for client authentication](https://www.ory.sh/docs/hydra/guides/jwt#jwts-for-client-authentication) - [Ory Hydra - Registering the client's public key](https://www.ory.sh/docs/hydra/guides/jwt#registering-the-clients-public-key) - [Ory Hydra - OAuth2 client credentials flow](https://www.ory.sh/docs/oauth2-oidc/client-credentials#jwt-bearer-profile-for-oauth2-client-authentication)flat-waitress-75076
09/20/2024, 2:50 PMbrief-egg-61061
09/20/2024, 2:50 PMbrief-egg-61061
09/20/2024, 2:50 PMprivate_key_jwt
client authentication, the JWT being referred to is not the access token that you receive from the /oauth2/token
endpoint. Instead, it's a JWT that the client creates and signs using its private key, and then sends to the Ory Hydra's token endpoint to authenticate itself. Here's a brief overview of the process: 1. The client creates a JWT with specific claims (like iss
, sub
, aud
, jti
, exp
). The iss
and sub
claims should contain the client_id
of the OAuth Client. The aud
claim should be the URL of the Authorization Server's Token Endpoint. 2. The client signs this JWT with its private key. 3. The client sends a request to the Ory Hydra's token endpoint (/oauth2/token
). In this request, the client includes the signed JWT in the client_assertion
parameter, and the client_assertion_type
parameter is set to urn:ietf:params:oauth:client-assertion-type:jwt-bearer
. 4. Ory Hydra verifies the JWT's signature and claims, and if everything is valid, it authenticates the client and responds with an access token. This method of client authentication is an alternative to methods like client_secret_basic
or client_secret_post
, where the client authenticates by sending its client_id
and client_secret
to the token endpoint. Sources: - [Ory Hydra - JWTs for client authentication](https://www.ory.sh/docs/hydra/guides/jwt#jwts-for-client-authentication) - [Ory Hydra - Registering the client's public key](https://www.ory.sh/docs/hydra/guides/jwt#registering-the-clients-public-key) - [Ory Hydra - OAuth2 client credentials flow](https://www.ory.sh/docs/oauth2-oidc/client-credentials#jwt-bearer-profile-for-oauth2-client-authentication)flat-waitress-75076
09/20/2024, 2:52 PMbrief-egg-61061
09/20/2024, 2:52 PMbrief-egg-61061
09/20/2024, 2:52 PMjwks_uri
is used in the context of client authentication methods that involve JSON Web Keys (JWKs), such as private_key_jwt
. In the private_key_jwt
method, the client creates and signs a JWT using its private key, and then sends this JWT to the Ory Hydra's token endpoint to authenticate itself. The jwks_uri
is a URL that points to the client's public JWK set. Ory Hydra uses the keys in this JWK set to verify the signature of the JWT sent by the client. If you're using the client_secret_basic
method for client authentication, you don't need to provide a jwks_uri
. In the client_secret_basic
method, the client sends its client_id
and client_secret
to the token endpoint using HTTP Basic Authentication, and Ory Hydra verifies these credentials to authenticate the client. Sources: - [Ory Hydra - JWTs for client authentication](https://www.ory.sh/docs/hydra/guides/jwt#jwts-for-client-authentication) - [Ory Hydra - Registering the client's public key](https://www.ory.sh/docs/hydra/guides/jwt#registering-the-clients-public-key) - [Ory Hydra - OAuth2 client credentials flow](https://www.ory.sh/docs/oauth2-oidc/client-credentials#jwt-bearer-profile-for-oauth2-client-authentication)brief-egg-61061
09/20/2024, 3:04 PMbrief-egg-61061
09/20/2024, 3:04 PM