Source code for simple_openid_connect.scripts.show_openid_tokens
#!/usr/bin/env python3importargparseimportjsonimportloggingimporturllib.parsefromcollectionsimportdefaultdictfromhttpimportHTTPStatusfromhttp.serverimportBaseHTTPRequestHandler,HTTPServerfromsecretsimporttoken_urlsafefromtypingimportAny,Dict,Optionalfromsimple_openid_connect.clientimportOpenidClientfromsimple_openid_connect.dataimport(TokenErrorResponse,TokenSuccessResponse,)# initialize a session object (which is very primitive but works)session=defaultdict(lambda:"")client=None# type: Optional[OpenidClient]
defmain()->None:argp=argparse.ArgumentParser(description="Script to retrieve access and refresh tokens from an OpenID-Connect identity provider and display them to the user. Useful for debugging purposes when requiring low-level access to these tokens.")argp.add_argument("--issuer",required=True,help="OpenID_Connect issuer url",)argp.add_argument("--client-id",required=True,help="OpenID-Connect client id",)argp.add_argument("--client-secret",required=True,help="OpenID-Connect client secret")argp.add_argument("--scope",help="OpenID-Connect scopes to request. Default to just 'openid'. Can be given multiple times, once for each additional scope",action="append",default=["openid"],)argp.add_argument("-p","--port",type=int,default=8080,help="Port to bind this server to. Defaults to 8080",)argp.add_argument("--host",default="127.0.0.1",help="IP address to bind this server to. Defaults to 127.0.0.1",)args=argp.parse_args()logging.basicConfig(level=logging.INFO)# initialize openid clientglobalclientown_base_url=f"http://{args.host}:{args.port}"client=OpenidClient.from_issuer_url(args.issuer,authentication_redirect_uri=own_base_url+"/callback",client_id=args.client_id,client_secret=args.client_secret,scope=" ".join(args.scope),)# serve a basic http server so that authorization code flow can be usedwithHTTPServer((args.host,args.port),RequestHandler)asserver:print(f"Open http://{server.server_name}:{server.server_port}")try:server.serve_forever()exceptKeyboardInterrupt:passif__name__=="__main__":main()