···11+import sqlite3
12from urllib.parse import urlparse
23from typing import Any
34import time
···349350350351# Helper to demonstrate making a request (HTTP GET or POST) to the user's PDS ("Resource Server" in OAuth terminology) using DPoP and access token.
351352# This method returns a 'requests' reponse, without checking status code.
352352-def pds_authed_req(method: str, url: str, user: dict, db: Any, body=None) -> Any:
353353+def pds_authed_req(
354354+ method: str,
355355+ url: str,
356356+ user: dict[str, str],
357357+ db: sqlite3.Connection,
358358+ body: dict[str, Any] | None = None,
359359+) -> Response | None:
353360 dpop_private_jwk = JsonWebKey.import_key(json.loads(user["dpop_private_jwk"]))
354361 dpop_pds_nonce = user["dpop_pds_nonce"]
355362 access_token = user["access_token"]
363363+364364+ response: Response | None = None
356365357366 # Might need to retry request with a new nonce.
358367 for i in range(2):
···365374 )
366375367376 with hardened_http.get_session() as sess:
368368- resp = sess.post(
377377+ response = sess.post(
369378 url,
370379 headers={
371380 "Authorization": f"DPoP {access_token}",
···376385377386 # If we got a new server-provided DPoP nonce, store it in database and retry.
378387 # NOTE: the type of error might also be communicated in the `WWW-Authenticate` HTTP response header.
379379- if resp.status_code in [400, 401] and resp.json()["error"] == "use_dpop_nonce":
388388+ if (
389389+ response.status_code in [400, 401]
390390+ and response.json()["error"] == "use_dpop_nonce"
391391+ ):
380392 # print(resp.headers)
381381- dpop_pds_nonce = resp.headers["DPoP-Nonce"]
393393+ dpop_pds_nonce = response.headers["DPoP-Nonce"]
382394 print(f"retrying with new PDS DPoP nonce: {dpop_pds_nonce}")
383395 # update session database with new nonce
384396 cur = db.cursor()
385385- cur.execute(
397397+ _ = cur.execute(
386398 "UPDATE oauth_session SET dpop_pds_nonce = ? WHERE did = ?;",
387399 [dpop_pds_nonce, user["did"]],
388400 )
···391403 continue
392404 break
393405394394- return resp
406406+ return response