@@ -332,6 +332,12 @@ def main():
332332 login .add_argument ("--username" , required = True )
333333 login .add_argument ("--password" )
334334
335+ generate_token = subparsers .add_parser (
336+ "generate-api-token" , help = "Print just the access token for a user"
337+ )
338+ generate_token .add_argument ("--username" , required = True )
339+ generate_token .add_argument ("--password" )
340+
335341 whoami = subparsers .add_parser ("whoami" , help = "Show current user" )
336342
337343 list_users = subparsers .add_parser ("list-users" , help = "List users" )
@@ -530,6 +536,29 @@ def main():
530536 payload ,
531537 form = True ,
532538 )
539+ elif args .command == "generate-api-token" :
540+ password = _prompt_if_missing (
541+ args .password ,
542+ "Password: " ,
543+ secret = True ,
544+ )
545+ payload = {"username" : args .username , "password" : password }
546+ status , body = _request_json (
547+ "POST" ,
548+ f"{ api_url } /user/login" ,
549+ payload ,
550+ form = True ,
551+ )
552+ if status < 400 :
553+ try :
554+ payload = json .loads (body ) if body else {}
555+ except json .JSONDecodeError as exc :
556+ raise SystemExit ("Failed to parse login response" ) from exc
557+ token = payload .get ("access_token" )
558+ if not token :
559+ raise SystemExit ("Login response missing access_token" )
560+ print (token )
561+ return
533562 elif args .command == "whoami" :
534563 status , body = _request_json ("GET" , f"{ api_url } /whoami" , token = token )
535564 elif args .command == "list-users" :
0 commit comments