Created
July 7, 2019 08:46
-
-
Save SimonShapiro/e8911023e8dfc7e0d0993e3e5f8f4028 to your computer and use it in GitHub Desktop.
Solid application authentication
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 262, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import requests" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 2.1a\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 263, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"resp = requests.request(\n", | |
" method = \"OPTIONS\",\n", | |
" url = \"https://anvil1.inrupt.net/profile/card#me\"\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 264, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'<https://anvil1.inrupt.net/profile/.well-known/solid>; rel=\"service\", <https://inrupt.net>; rel=\"http://openid.net/specs/connect/1.0/issuer\", <card.acl>; rel=\"acl\", <card.meta>; rel=\"describedBy\", <http://www.w3.org/ns/ldp#Resource>; rel=\"type\"'" | |
] | |
}, | |
"execution_count": 264, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"resp.headers[\"Link\"]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 265, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'https://inrupt.net'" | |
] | |
}, | |
"execution_count": 265, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"openid_provider = resp.links[\"http://openid.net/specs/connect/1.0/issuer\"][\"url\"]\n", | |
"openid_provider" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 2.1b - shows that NSS only uses Link as above for .../1.0/issuer and not as content" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 266, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"resp = requests.request(\n", | |
" method = \"get\",\n", | |
" url = \"https://anvil1.inrupt.net/profile/card#me\"\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 267, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"False" | |
] | |
}, | |
"execution_count": 267, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"\"oidc\" in resp.content.decode(\"utf-8\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 268, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<Graph identifier=Ne497ad678b2e490598b51766330c2b62 (<class 'rdflib.graph.Graph'>)>" | |
] | |
}, | |
"execution_count": 268, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"import rdflib\n", | |
"g = rdflib.Graph()\n", | |
"g.parse(\"https://anvil1.inrupt.net/profile/card#me\")\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 269, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"http://xmlns.com/foaf/0.1/name\n", | |
"---------\n", | |
"http://www.w3.org/ns/pim/space#preferencesFile\n", | |
"---------\n", | |
"http://www.w3.org/ns/solid/terms#publicTypeIndex\n", | |
"---------\n", | |
"http://www.w3.org/ns/solid/terms#privateTypeIndex\n", | |
"---------\n", | |
"http://www.w3.org/ns/pim/space#storage\n", | |
"---------\n", | |
"http://www.w3.org/ns/solid/terms#account\n", | |
"---------\n", | |
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\n", | |
"---------\n", | |
"http://www.w3.org/ns/ldp#inbox\n", | |
"---------\n", | |
"http://www.w3.org/ns/auth/acl#trustedApp\n", | |
"---------\n" | |
] | |
} | |
], | |
"source": [ | |
"for (p,) in g.query(\"\"\"\n", | |
"select distinct ?p {\n", | |
" <https://anvil1.inrupt.net/profile/card#me> ?p ?o\n", | |
"}\n", | |
"\"\"\"):\n", | |
" print(str(p))\n", | |
" print(\"---------\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 3" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 270, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"resp = requests.request(\n", | |
" method = \"GET\",\n", | |
" url = openid_provider+\"/.well-known/openid-configuration\"\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 4" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 271, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'issuer': 'https://inrupt.net',\n", | |
" 'authorization_endpoint': 'https://inrupt.net/authorize',\n", | |
" 'token_endpoint': 'https://inrupt.net/token',\n", | |
" 'userinfo_endpoint': 'https://inrupt.net/userinfo',\n", | |
" 'jwks_uri': 'https://inrupt.net/jwks',\n", | |
" 'registration_endpoint': 'https://inrupt.net/register',\n", | |
" 'response_types_supported': ['code',\n", | |
" 'code token',\n", | |
" 'code id_token',\n", | |
" 'id_token',\n", | |
" 'id_token token',\n", | |
" 'code id_token token',\n", | |
" 'none'],\n", | |
" 'response_modes_supported': ['query', 'fragment'],\n", | |
" 'grant_types_supported': ['authorization_code',\n", | |
" 'implicit',\n", | |
" 'refresh_token',\n", | |
" 'client_credentials'],\n", | |
" 'subject_types_supported': ['public'],\n", | |
" 'id_token_signing_alg_values_supported': ['RS256', 'RS384', 'RS512', 'none'],\n", | |
" 'token_endpoint_auth_methods_supported': ['client_secret_basic'],\n", | |
" 'token_endpoint_auth_signing_alg_values_supported': ['RS256'],\n", | |
" 'display_values_supported': [],\n", | |
" 'claim_types_supported': ['normal'],\n", | |
" 'claims_supported': [],\n", | |
" 'claims_parameter_supported': False,\n", | |
" 'request_parameter_supported': True,\n", | |
" 'request_uri_parameter_supported': False,\n", | |
" 'require_request_uri_registration': False,\n", | |
" 'check_session_iframe': 'https://inrupt.net/session',\n", | |
" 'end_session_endpoint': 'https://inrupt.net/logout'}" | |
] | |
}, | |
"execution_count": 271, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"resp.json()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 272, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'OPENID_CONFIGURATION': {'issuer': 'https://inrupt.net',\n", | |
" 'authorization_endpoint': 'https://inrupt.net/authorize',\n", | |
" 'token_endpoint': 'https://inrupt.net/token',\n", | |
" 'userinfo_endpoint': 'https://inrupt.net/userinfo',\n", | |
" 'jwks_uri': 'https://inrupt.net/jwks',\n", | |
" 'registration_endpoint': 'https://inrupt.net/register',\n", | |
" 'response_types_supported': ['code',\n", | |
" 'code token',\n", | |
" 'code id_token',\n", | |
" 'id_token',\n", | |
" 'id_token token',\n", | |
" 'code id_token token',\n", | |
" 'none'],\n", | |
" 'response_modes_supported': ['query', 'fragment'],\n", | |
" 'grant_types_supported': ['authorization_code',\n", | |
" 'implicit',\n", | |
" 'refresh_token',\n", | |
" 'client_credentials'],\n", | |
" 'subject_types_supported': ['public'],\n", | |
" 'id_token_signing_alg_values_supported': ['RS256', 'RS384', 'RS512', 'none'],\n", | |
" 'token_endpoint_auth_methods_supported': ['client_secret_basic'],\n", | |
" 'token_endpoint_auth_signing_alg_values_supported': ['RS256'],\n", | |
" 'display_values_supported': [],\n", | |
" 'claim_types_supported': ['normal'],\n", | |
" 'claims_supported': [],\n", | |
" 'claims_parameter_supported': False,\n", | |
" 'request_parameter_supported': True,\n", | |
" 'request_uri_parameter_supported': False,\n", | |
" 'require_request_uri_registration': False,\n", | |
" 'check_session_iframe': 'https://inrupt.net/session',\n", | |
" 'end_session_endpoint': 'https://inrupt.net/logout'}}" | |
] | |
}, | |
"execution_count": 272, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"local_storage = {}\n", | |
"local_storage[\"OPENID_CONFIGURATION\"] = resp.json()\n", | |
"local_storage" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 5 Old" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 273, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import cryptography\n", | |
"from cryptography.hazmat.backends import default_backend\n", | |
"from cryptography.hazmat.primitives import serialization" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 274, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"pvt = cryptography.hazmat.primitives.asymmetric.rsa.generate_private_key(public_exponent=65537,\n", | |
"... key_size=2048, \n", | |
" backend=default_backend())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 275, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"b'-----BEGIN RSA PRIVATE KEY-----\\nMIIEpAIBAAKCAQEA0JXZdLHsbsH+XKRzS2gyoH59iIqk97jQODNIVLBgA6ij+9Z0\\nmoxFMLeRqTBFlFX2ZEy8U0G0Xf1IF1SzMTgjKCIWh2dBoWHWuSB6XZ2TFhwflNiu\\n2j7dTTTnwQwwwSF1HzmGNlfplLLmlWwBDRDPvlwHfedV8lKBXKo6bGI2SDLFVnzE\\ngfDGQbujA7Bf9bSPyZaFAhXMhR7tZbLofFrdZ9i5rVliYL64P7lcFzRoRxTBWEId\\nUnYbUoDvmWuCuTVJIfVw4Jjls8x225hX0akz77QoPWYpS64w1Ml9xBijRrdlgg90\\n2RKniIco9EsSx/r+a+MjiZKf0oX2blAwCLPdhwIDAQABAoIBABcc47G4nXhQar0d\\nQ+FRNHrwSTy+EDWa9wejNxqbSKhfIXygcN9HN8uEK9HRlYQwWlMW5a9cEn5vuHNN\\nYWXM0Kh7zn9Gg9E8JCzzWlvRQCEtEJrPv+BTIvaRLDUKAsUDzhSdrS+MYkel40Mf\\naqZl/H8dd38OCUoGtmrsOfkUkOtC8cDEr9+4FDKwnT+68wWD43qCG+tKCpeN+sJj\\nzEZP05WUMLlv0JfIkr7nzf4gL6tQQt0JRJmpg8mEkiYCMxKP1QRyEs3eeCW7Idoa\\nOkTa+0qbmrSQ4MHc36UuFcWGciGrENObmb4LM76ybl7yVq9/wxnAl/X2wVMdM5lw\\nW8sul9ECgYEA56odrra3LSRVi8I7KyXc74UypvqU8yUURyGTtxWpa/p0i9sUNFge\\nGQb54xku+lgiBFaVSDY0Zr7l9K0zUsqP/L3tJz6KJVV4YRiCRo3/naQfhMTV25TF\\nsHOIhD967Lq7xB3ATcCyuvRKHQVi72s32oVbhKa9Knb5N5r2ywbFU+MCgYEA5n8X\\npFau/XxEvp66RhGpMwrfljT600FsN0egnWjOADgHGmAa8mbHl44b3yeuyYkklBGI\\nrT4qPzi2jxoI6VS0Hnuc3bGGCyqIjf+TaRL4edN7Ed/L1TJxuDeYb8RYETX/EVQU\\nBdRyMS7Y9rvEMa4tuJxMwoqbq5Rtjrgi2f1n6Q0CgYAm0BWRBAPEiGXcuHn5TKqr\\nZoGKAEmcQwYWtMVu0y5DbP7Bv76u1mSUhNqw9bMtNj7cwzTXmF1HKYyVZb9Hi7B8\\nA8YL4Sp7/sngWp7Y+0lsO+cb825xD4fffDvPDGOn7dEvllx1qmdHc05HdnOQ8UG2\\nVslyfA0NZEl0y321njjJSQKBgQC2VmvZcUlU9W1cbixlKatz2XIuXRLe864rvNnu\\nK+5qdegIkWY/w9a4qY6a5cV7YKYzC/vXMIozISYp5iqOipdCVf8t0TV8t9T2n+t4\\n/6zYkteUuDmDGjijxjcsk2Inm1N/3cdJJVqAVdMEvFzkACnjFKIUc5naDbztXfUU\\nBUaiMQKBgQDcpl3Nmje3CV+WVtKYZQSkmjRCrilm9LxMWo1I1UZqCqhR1jIFUgPv\\nCQYKO9GAtTcWpXZuS9nU2b5wLE0+gGqgNyfTTXLoZTYN5Uy3AUnGcwRohtBn+8JB\\n7FgsZ9SLbDhP+Uf6LJmiGG5V2Skdi1/jUY1RriBAI8ZtLqLR3F3xJQ==\\n-----END RSA PRIVATE KEY-----\\n'" | |
] | |
}, | |
"execution_count": 275, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"pvt.private_bytes(\n", | |
"... encoding=serialization.Encoding.PEM,\n", | |
"... format=serialization.PrivateFormat.TraditionalOpenSSL,\n", | |
"... encryption_algorithm=serialization.NoEncryption()\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 5" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 276, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import json\n", | |
"import pprint\n", | |
"from jwcrypto import jwk \n", | |
"key = jwk.JWK.generate(kty='RSA', size=2048)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 277, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"private_json = json.loads(key.export_private())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 278, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"local_storage[\"RP_PRIVATE_KEY\"] = {\"alg\": \"RS256\", \"ext\":True,\n", | |
"\t \"key_ops\":[ \n", | |
"\t \"verify\"\n", | |
"\t ],\n", | |
"\t**private_json}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 279, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"public_json = json.loads(key.export_public())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 280, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"local_storage[\"RP_PUBLIC_KEY\"] = {\"alg\": \"RS256\", \"ext\":True,\n", | |
"\t \"key_ops\":[ \n", | |
"\t \"sign\"\n", | |
"\t ],\n", | |
"\t**public_json}" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 6" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 281, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"dict_keys(['OPENID_CONFIGURATION', 'RP_PRIVATE_KEY', 'RP_PUBLIC_KEY'])" | |
] | |
}, | |
"execution_count": 281, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"local_storage.keys()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 7" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 282, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"resp = requests.request(\n", | |
" method = \"GET\",\n", | |
" url = local_storage[\"OPENID_CONFIGURATION\"][\"jwks_uri\"]\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 283, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'keys': [{'kid': 'vZiCddeHlt4',\n", | |
" 'kty': 'RSA',\n", | |
" 'alg': 'RS256',\n", | |
" 'n': '1KZEoHz8tZQYw3re00FOsKGx79xr5tIIf1CB5qcv06x9an1pBCETG_g5LcRq5XtNYdpq1MtbLoustBJu3TgM2A1Q6kHpy-jvFtlJPrp62HQXT-m3NEb4IRfOT57HLgTFSP6bsfTKohPLOdU1ldYI0FPhjOn1FDQLxI1V5I9nYEJxXEaMss_qoymCQli0VpBWInSPcvd0N9KCuol9-ctcXRwSU4okZgrTjEBm3hIgy6BsgT-BIFI_J8yuuM8AKDcWH0vk_jN9f08Ja9kJJo6D7susYP2tbEf7XUEg-hCS3NA03jj-MRqS6LMN8OEOrPplkF5UR8tKcBhlaMl-wFYTqQ',\n", | |
" 'e': 'AQAB',\n", | |
" 'key_ops': ['verify'],\n", | |
" 'ext': True},\n", | |
" {'kid': 'oW_CA4sBaig',\n", | |
" 'kty': 'RSA',\n", | |
" 'alg': 'RS384',\n", | |
" 'n': '56WQ9K_Om_x2hN3l-IwBXDhlFqO4NgfNS_e-BuRfDM79cC9aLCvB-yc_fCEgZH_Mfcb-UU4yLN7Gvyafgv4jnx16AVRIIG2StrbC0ehM5QXaDHY0H7yu9S2YOiRpC9eSK39BZ0IfwKXX9BcENBQPJDz15Kmk4dRCu_LzHOQXJtQ37sQzdNC0wnUsTYFWATMhQfblY_wHI2WFGbXh_2yScMoYIwckDEmVaZsG53XJ9fdWbYFZr35L10f5_kvbG_9eEMWbVcmKny4Zp7-WZRB7kdUSYwmP2UAmUWPfk-U9haBBxcc1uqkaUwpwj3uHFh7Qf_DbDPxrEZ353jET9kYJrQ',\n", | |
" 'e': 'AQAB',\n", | |
" 'key_ops': ['verify'],\n", | |
" 'ext': True},\n", | |
" {'kid': 'q-YVIxbiQjk',\n", | |
" 'kty': 'RSA',\n", | |
" 'alg': 'RS512',\n", | |
" 'n': 't19Mfx6axVZEqwGppeC9snVjoGhfc2rfO_NGkCqOGn6d37RlZ1p5d1sUKVNFH4cs3MdUE7D2rji9uwt1pVq8cbvP6ERYzEe8NPykHKTqIabgi866Y8IQjsBHtnLQw2imiwX18O14f-SMrV4-VMtydTUDv9h1ELbJZmhW2ELdWJedMqGsnmP7cRhEh0LwF9lNQt9sY66_4kFwA64_pY6AQM6evzQ3mAlr5ObvWWnZ9_hBRBTntKpVM6FdeCTA3d_vO-vHacQu6RlSs3Ek0QCmbdhI9XMKE06HezcKFe-Fl3v9QIBWT4PZEAQImIbx3Kr5RRuipnRxVaN3j_0zIVi21Q',\n", | |
" 'e': 'AQAB',\n", | |
" 'key_ops': ['verify'],\n", | |
" 'ext': True},\n", | |
" {'kid': 'qbwrxeppWL0',\n", | |
" 'kty': 'RSA',\n", | |
" 'alg': 'RS256',\n", | |
" 'n': 'zVvZy8R7TebO2zTPYGXd8fkupjSJUhVpqNSmV1twT2G3heNKTG2byl1ZjkjNO5ePeg22c7v6zg1P1S7TwMAUmh2zHVnylnumLzMu3fWwrRYLPXSE8GGbscLLmlULnIKDaaHxUpCJ0gj4Cm_FWlmdT7_Pq9R4Q_qh3clAcP-LV7HDjeEH5UDN1SKPlTa01WeNYGeJ8JPqX0yDHgAYqzTGuZsAi-k6ucPrufZctAtKfpzmv3o4MlkFdn_qLEi3NZMgWNc5b5noDRhBl_V38X-9vU_guB9u0hDnH4uY0PntdhjBt0bACAx4c4_9ia7aNpX6ew-__AiRn4hqdcO41cnZoQ',\n", | |
" 'e': 'AQAB',\n", | |
" 'key_ops': ['verify'],\n", | |
" 'ext': True},\n", | |
" {'kid': 'rLcRkHrEwws',\n", | |
" 'kty': 'RSA',\n", | |
" 'alg': 'RS384',\n", | |
" 'n': 'ymoSZbJUxXZYq1tdcWUQeARKVRsgqz3UvtJNuMjUk3n5FNmutcjaLdol7ppZ20mp7VE_2DQoHo3gbYqFqghy88a8-JQzw-sC2cFwi19QZf46JMuebn7eSxC4UxLg-Jh9m8cazpySMImhOePAu8wYjhrmegdm-yftdNNNpr8JoQahTTQvIHupXbkrShFEcutXGDYUnh2Ny52JiKz-AxHRIsOkbxf3552gCVpV9z-cnRxsVQHRJ3QA0PQWNUq2YnyhxLgFTORn8h8ZOTO2nbsN89aLvd0WbnMkWGlJ1Yd8PuvpBnFf67EWHgXuvhquuAfwXtBYbxhhoXIy9Rj64QVG2w',\n", | |
" 'e': 'AQAB',\n", | |
" 'key_ops': ['verify'],\n", | |
" 'ext': True},\n", | |
" {'kid': '4mCUpCQaVW0',\n", | |
" 'kty': 'RSA',\n", | |
" 'alg': 'RS512',\n", | |
" 'n': '3Gbu8oBdvUyHZdf9epGxycV09wlIYl1yLmzdW9Spe1LkDNEHkVTGynRPPu81nwdHjB0ugpD-1UaxoyhK73TWouHEMwQbiRrUNd2bv_-XReLvbX5uKusABrkx3RS0lGgJnhsdJib_I2zAJkoZlWBNxL1OLqe0sTC8jTh56Gji1-HHYzET7VJjokGDswRw2GCbc9TzMBV3BEDFXu5-LGrBzPBigW-rnngipL23AM2q7zzZZhXGvtJ0ldyqPZBjPEP5aCaiPcxbHNpzXirYiF5jp6pusNE60hpIWyV_-K6MkeQtYu2gijnYaczvvTDSpXkDFJU9bANuWcmrfGWd688ihQ',\n", | |
" 'e': 'AQAB',\n", | |
" 'key_ops': ['verify'],\n", | |
" 'ext': True},\n", | |
" {'kid': 'OghWZ4Y91k4',\n", | |
" 'kty': 'RSA',\n", | |
" 'alg': 'RS256',\n", | |
" 'n': '0hfr7Bulk-_94FsDFO9FQG3zKbwTkuaEj0YQwKuHf8v1Rqmd9BYrE9O9fGHR9XMEQDLKwSaU0druRB_S_gFzX9pgDKKpPWmPbUxNpubu9u-LX5JLwelog8bsw_glHTbFoJNpxIKfM-GGHScrkbQkzQ9G2B3242Pb5GpiZPVMvBOuiRex58pD_G1TY8oyQe4LusTRm8xvyRgOfkrSYnNFI4c_PzVt25UpIzpnaCv4SkZPNcgDXHIlAjMyHEv6isJ_v7gSmw9m8uNfb_SUP1l85zzFnkB7xVaprYDKiX-_G_cmTPjRMWh3iGsNLsaL22VmQypPBaVeFNANYC0rX73P4Q',\n", | |
" 'e': 'AQAB',\n", | |
" 'key_ops': ['verify'],\n", | |
" 'ext': True}]}" | |
] | |
}, | |
"execution_count": 283, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"resp.json()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 8" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 284, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"local_storage[\"OP_JWKS\"] = resp.json()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 9" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 285, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"data = {\n", | |
"\t \"grant_types\": [\"implicit\"],\n", | |
"\t \"issuer\": \"https://inrupt.net\",\n", | |
"\t \"redirect_uris\": [\"http://localhost:8888/tree/\"], # what happens with localhost\n", | |
"\t \"response_types\": [\"id_token token\"],\n", | |
"\t \"scope\": \"openid profile\"\n", | |
"\t}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 286, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"resp = requests.request(\n", | |
" method = \"POST\",\n", | |
" url = local_storage[\"OPENID_CONFIGURATION\"][\"registration_endpoint\"],\n", | |
" json = data\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 10" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 287, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<Response [201]>" | |
] | |
}, | |
"execution_count": 287, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"resp" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 11\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 288, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'client_id': '63eeefcd2b98fee23ffbd2461128a17d',\n", | |
" 'redirect_uris': ['http://localhost:8888/tree/'],\n", | |
" 'response_types': ['id_token token'],\n", | |
" 'grant_types': ['implicit'],\n", | |
" 'application_type': 'web',\n", | |
" 'id_token_signed_response_alg': 'RS256',\n", | |
" 'token_endpoint_auth_method': 'client_secret_basic',\n", | |
" 'frontchannel_logout_session_required': False,\n", | |
" 'registration_access_token': 'eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lucnVwdC5uZXQiLCJzdWIiOiI2M2VlZWZjZDJiOThmZWUyM2ZmYmQyNDYxMTI4YTE3ZCIsImF1ZCI6IjYzZWVlZmNkMmI5OGZlZTIzZmZiZDI0NjExMjhhMTdkIn0.JyqJ2PKSCqFny3p-xdOX5ePZPAKn72-tPiZYb44lZP7w7QeV3ZG8yBAnn6zldIBeeTQKcHKP9485bX27rP5LvVhEGnk7hyccCVqYK4DY8ubNTvczmeHp5XkQkkBtseJjrueSL16_KvI1z2VGVNWuQHIp_yVi_edMLip0DUuNsQrQzetOukm92TwySxvwaUCAKvonQPI0UFz4OnYG39B-t6xGyDCWm9cw2mPfwUW7yn5Qe6ql7dsg1Lv_ErmSgJkeWKLdJ4Sa2qhGYsN5SVq3Pdl4RTpjYjzryCSYaZyNuULBebg-ae8_u0pcIV1fbRniwhHvg7WPgvfCLa9V-7quBg',\n", | |
" 'registration_client_uri': 'https://inrupt.net/register/63eeefcd2b98fee23ffbd2461128a17d',\n", | |
" 'client_id_issued_at': 1562488156}" | |
] | |
}, | |
"execution_count": 288, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"resp.json()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 289, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"local_storage[\"CLIENT_REGISTRATION_RESPONSE\"] = resp.json()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 290, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"dict_keys(['OPENID_CONFIGURATION', 'RP_PRIVATE_KEY', 'RP_PUBLIC_KEY', 'OP_JWKS', 'CLIENT_REGISTRATION_RESPONSE'])" | |
] | |
}, | |
"execution_count": 290, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"local_storage.keys()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 12" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 291, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'009bb7ee4ce14f3a8106da05d05a41da'" | |
] | |
}, | |
"execution_count": 291, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"import uuid\n", | |
"nonce = uuid.uuid4()\n", | |
"nonce.hex" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 292, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'redirect_uri': 'http://localhost:8888/tree',\n", | |
" 'display': 'page',\n", | |
" 'nonce': '009bb7ee4ce14f3a8106da05d05a41da',\n", | |
" 'key': {'alg': 'RS256',\n", | |
" 'ext': True,\n", | |
" 'key_ops': ['verify'],\n", | |
" 'e': 'AQAB',\n", | |
" 'kty': 'RSA',\n", | |
" 'n': 'pdd1au_TtQ-PY7tkjIN6hshuftLNQYBEXwKVt0aPElAF1g0Yg2Bgp-bpWNKHNpyyft7jTDsoMocBbAmCoo6lDRI7FC9Xlgle00RIy4jxZJAXyeCtbvoIMore2iY8BQ6S4ycys4knNzKyeO16AsFuAtPg3KAukONVgSJJzm7dWo3Hs7swK6dGH3thMFZMk27Z6ybQOwrUdMIlHYcqzAcVufUaNrn_zGI8qTuxc4T_9KIR4zA1DuM0pM-sLZr8PnHzsXkGT0yklfHrvSAzVLK-1n-l7KCWoz4pA2I_sRsrb7D7d_yF8zj9KbYo-CX9R9MjNdEltUrYYKzr5luKa1O0jQ'}}" | |
] | |
}, | |
"execution_count": 292, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"raw_request = {\n", | |
" \"redirect_uri\": \"http://localhost:8888/tree\",\n", | |
" \"display\": \"page\",\n", | |
" \"nonce\": nonce.hex,\n", | |
" \"key\": local_storage[\"RP_PUBLIC_KEY\"]\n", | |
"}\n", | |
"raw_request[\"key\"][\"key_ops\"] = ['verify']\n", | |
"raw_request" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Extract `RP_PRIVATE_KEY` as `PEM`" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 293, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'alg': 'RS256',\n", | |
" 'ext': True,\n", | |
" 'key_ops': ['verify'],\n", | |
" 'd': 'FoQ0WvqI4fJk44OT2UgYoKgh6HIykAwcPFIbhbC8yB25TSCmDWBOfz1ovTiIRy_rRDJ65eS6RnHyDXsVE4EOg8HP56Ot3p8TEtgYkhnbvG2b7TrmEUU9S69zJmc-iuk5pEG0LpAWlPX7KVQE1s7wYs3ln87Xw7A58bh4EOEYiKyzUrG9XUNdqI933mZSwD5WBw0s5gLqm6sUl91kcI-wqnVJr7QNoUO_XXSFKHnd_KYGwBKDiCUT7863yrabdjrpwcF9d_cWseizscQm4bOyWlRdCywwEmkAdZu63ockTbzIUqmf1J76NfkBAs6I5r2vxqeOXOpxTlJy3Wpy8KulwQ',\n", | |
" 'dp': 'Rq3pyHuS6E6kWSYR-G-ZJWj6FKxs6pNUJ5Q8MxEJobceHNZEmB12Sq2yH32lOO65fciFXTiHWdG8Weut24XrVFxgVRoTBmSW2KaX27O8UljkX6kwNx-kG_q6kWsae791DRdlC5QXXzFtUknKWCeOz9Y2h_gAREGQRMvFp_SXPIE',\n", | |
" 'dq': 'AexqsO8OeM-hH7HFFT55pUTBxaeqYRRPKXcTBxf_JQx7jNV6iOTG3FlhXWiJ0MySpMEDmTkCs4ixMgBL6E0K4YGoL-2Y8MfBhC2aALNGiGUmScEV2IbJfXTr6NvdL6H2uN7gZs8oBlaSqU3EZiw_agPmeohCSg90ZEdGSkRpDD0',\n", | |
" 'e': 'AQAB',\n", | |
" 'kty': 'RSA',\n", | |
" 'n': 'pdd1au_TtQ-PY7tkjIN6hshuftLNQYBEXwKVt0aPElAF1g0Yg2Bgp-bpWNKHNpyyft7jTDsoMocBbAmCoo6lDRI7FC9Xlgle00RIy4jxZJAXyeCtbvoIMore2iY8BQ6S4ycys4knNzKyeO16AsFuAtPg3KAukONVgSJJzm7dWo3Hs7swK6dGH3thMFZMk27Z6ybQOwrUdMIlHYcqzAcVufUaNrn_zGI8qTuxc4T_9KIR4zA1DuM0pM-sLZr8PnHzsXkGT0yklfHrvSAzVLK-1n-l7KCWoz4pA2I_sRsrb7D7d_yF8zj9KbYo-CX9R9MjNdEltUrYYKzr5luKa1O0jQ',\n", | |
" 'p': '0yo0i1wAazLAC1M47wa9lZdtlIW2suKrWqjX8Hg2Xn3ZxHxgJP7cbjbcHa_DZCFzuo_Qo4vpD2rg8_TjJETLdqkKeU5VJu17ZJ1qRfhwGyLPLYhOzTWI0X3t17vMK5949SDjdzy4Vf8GlCfre6JYaEBOxthS3Lr27LibNkUULdk',\n", | |
" 'q': 'yQ25giSA93ead5YpPknbJiK4t4CgWuwXlsG7ea5wTJtlYtGa5S4JcTIac-pzr1EF2XsKTdMOgzkM8K-HY5pov00K2sHiwdDCUh14kd_XCULUrn5oXVlsTBxSYrbvDfFyQSnBz6QQ8SMc8EBjmV_Hw0rrWoi0mJji5vU1TKMJp9U',\n", | |
" 'qi': 'NKicn1kG04s5IkW21WHTzozQf8S8iDMhcBjjIRSIW0cz7H_QbVoRfNoxTpS1brbwsvU8My6RuqGo3aQpDbwa1pK-tBz0RM2sgqY1ERCno20fPqYSzP6SdQl1Lv2B03Ilzx7CZyB4yRqlXup0ayYNgSFEt6eRyhLVhu-D7WMdPzU'}" | |
] | |
}, | |
"execution_count": 293, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"\n", | |
"local_storage[\"RP_PRIVATE_KEY\"]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 294, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"rehydrate = jwk.JWK.from_json(json.dumps(local_storage[\"RP_PRIVATE_KEY\"]))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 295, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"rehydrated_private = rehydrate.export_to_pem(private_key=True, password=None)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Form JWT using private PEM and request above" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 296, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import jwt\n", | |
"request_jwt = jwt.encode(raw_request, rehydrated_private, algorithm=\"RS256\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 297, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'63eeefcd2b98fee23ffbd2461128a17d'" | |
] | |
}, | |
"execution_count": 297, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"local_storage[\"CLIENT_REGISTRATION_RESPONSE\"][\"client_id\"]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 298, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"resp = requests.request(\n", | |
" url = \"https://inrupt.net/authorize\",\n", | |
" method = \"GET\",\n", | |
" params = {\n", | |
" \"scope\": \"openid\",\n", | |
" \"client_id\": local_storage[\"CLIENT_REGISTRATION_RESPONSE\"][\"client_id\"],\n", | |
" \"response_type\": \"id_token token\",\n", | |
" \"request\": request_jwt\n", | |
" }\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 299, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<Response [500]>" | |
] | |
}, | |
"execution_count": 299, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"resp" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 300, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'https://inrupt.net/authorize?scope=openid&client_id=63eeefcd2b98fee23ffbd2461128a17d&response_type=id_token+token&request=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJyZWRpcmVjdF91cmkiOiJodHRwOi8vbG9jYWxob3N0Ojg4ODgvdHJlZSIsImRpc3BsYXkiOiJwYWdlIiwibm9uY2UiOiIwMDliYjdlZTRjZTE0ZjNhODEwNmRhMDVkMDVhNDFkYSIsImtleSI6eyJhbGciOiJSUzI1NiIsImV4dCI6dHJ1ZSwia2V5X29wcyI6WyJ2ZXJpZnkiXSwiZSI6IkFRQUIiLCJrdHkiOiJSU0EiLCJuIjoicGRkMWF1X1R0US1QWTd0a2pJTjZoc2h1ZnRMTlFZQkVYd0tWdDBhUEVsQUYxZzBZZzJCZ3AtYnBXTktITnB5eWZ0N2pURHNvTW9jQmJBbUNvbzZsRFJJN0ZDOVhsZ2xlMDBSSXk0anhaSkFYeWVDdGJ2b0lNb3JlMmlZOEJRNlM0eWN5czRrbk56S3llTzE2QXNGdUF0UGczS0F1a09OVmdTSkp6bTdkV28zSHM3c3dLNmRHSDN0aE1GWk1rMjdaNnliUU93clVkTUlsSFljcXpBY1Z1ZlVhTnJuX3pHSThxVHV4YzRUXzlLSVI0ekExRHVNMHBNLXNMWnI4UG5IenNYa0dUMHlrbGZIcnZTQXpWTEstMW4tbDdLQ1dvejRwQTJJX3NSc3JiN0Q3ZF95Rjh6ajlLYllvLUNYOVI5TWpOZEVsdFVyWVlLenI1bHVLYTFPMGpRIn19.Nzncetjm0a20s96F-F-hfRaHJGEBkvHa0HWX1eRzi_1M6B4JPRk6D6L6AEgoGtzw8fmpqjCOpb1G8TpYQeljw8O-fz2T1embcIaq--uuVY0eYEVNj_FE65224d_pbEu0tjdCLB84QayrTeRwSOEzl27iqcxBYTJq9XmXYvZP4zCgMnrauxxEWyWpXXKpjNGbexhGkmWOOw9dwMaSzQvGFA4j8LFB2As0L9_PRadnD6Y2ZI0NQc4sM2k5CZpNN0LsA-lfrBe4Wli47f65sMJ4s2eZghxXqHlND6FpX4zpzNO8aUaK7AIlmTM2nkrL3qXCPWriQD5CLsIyG_P5DfyXCQ'" | |
] | |
}, | |
"execution_count": 300, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"resp.url\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
mentioned in gitter: your JWT needs to use "alg":"none" instead of "alg":"RS256" (that'll fix the 500), and your redirect_uri in the request doesn't match the one you registered (registered "http://localhost:8888/tree/", using "http://localhost:8888/tree"). try
curl -v 'https://inrupt.net/authorize?scope=openid%20profile&client_id=63eeefcd2b98fee23ffbd2461128a17d&response_type=id_token%20token&request=eyJhbGciOiJub25lIn0.eyJyZWRpcmVjdF91cmkiOiJodHRwOi8vbG9jYWxob3N0Ojg4ODgvdHJlZS8iLCJpc3MiOiI2M2VlZWZjZDJiOThmZWUyM2ZmYmQyNDYxMTI4YTE3ZCIsImRpc3BsYXkiOiJwYWdlIiwibm9uY2UiOiIwMDliYjdlZTRjZTE0ZjNhODEwNmRhMDVkMDVhNDFkYSIsImtleSI6eyJhbGciOiJSUzI1NiIsImV4dCI6dHJ1ZSwia2V5X29wcyI6WyJ2ZXJpZnkiXSwiZSI6IkFRQUIiLCJrdHkiOiJSU0EiLCJuIjoicGRkMWF1X1R0US1QWTd0a2pJTjZoc2h1ZnRMTlFZQkVYd0tWdDBhUEVsQUYxZzBZZzJCZ3AtYnBXTktITnB5eWZ0N2pURHNvTW9jQmJBbUNvbzZsRFJJN0ZDOVhsZ2xlMDBSSXk0anhaSkFYeWVDdGJ2b0lNb3JlMmlZOEJRNlM0eWN5czRrbk56S3llTzE2QXNGdUF0UGczS0F1a09OVmdTSkp6bTdkV28zSHM3c3dLNmRHSDN0aE1GWk1rMjdaNnliUU93clVkTUlsSFljcXpBY1Z1ZlVhTnJuX3pHSThxVHV4YzRUXzlLSVI0ekExRHVNMHBNLXNMWnI4UG5IenNYa0dUMHlrbGZIcnZTQXpWTEstMW4tbDdLQ1dvejRwQTJJX3NSc3JiN0Q3ZF95Rjh6ajlLYllvLUNYOVI5TWpOZEVsdFVyWVlLenI1bHVLYTFPMGpRIn19.'
next step, which will be hard without a browser, is logging in in the UI and getting a cookie.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In this notebook I have recorded all the steps up to the failing step 12 from (the Solid application authentication spec)[https://github.com/solid/webid-oidc-spec/pull/27/files].
Steps 2b simply shows that the NSS does not send the issuer as part of the content, using the
Link
instead.Also, Step 5 Old get a private key in
PEM
format, but doesn't use it: rather step 5 below that is used.