PyPIへの登録にユーザー名とパスワードを使うのはやめよう。APIトークンを使おう


はじめに

PyPI へパッケージを登録する記事を見ているとユーザー名とパスワードを渡す例が多く散見されました。

それは古いやり方なのでやめてください。

最近のPyPIはセキュリティにも力を入れており、APIトークンの仕組みを持っています。

PyPI now supports uploading via API token

一般に、この手のAPIの認証にはユーザー名/パスワードを使うよりAPIトークンを使う方がセキュアに運用できると言われています。

この記事ではPyPIへの登録時に、ユーザー名/パスワードではなくAPIトークンを使う方法を紹介します。

PyPIでAPIトークンを作成する

はじめに、PyPIでAPIトークンを作成します。

  1. PyPIにログインする
  2. Add API token のページで Token nameScope を埋めた後 Add Token ボタンを押下する
    • Token name: 好きな値を入れてください
    • Scope: すでにパッケージプロジェクトが登録済みの場合は Project: <パッケージ名> が選択できます。Entire account (all projects) という選択肢も表示されますがこれは全プロジェクトで有効なAPIトークンなのでセキュリティの観点からはおすすめしません
  3. 結果生成されたpypi- から始まる長い英数字列がAPIトークンとなります( pypi- もAPIトークンの一部です)。これをメモ帳などにコピペしておいてください

PyPIにAPIトークンを使って登録する

つぎに、PyPIに、APIトークンを使ってパッケージを登録します。

PyPIへの登録サーバーは依然としてユーザー名/パスワード型のインターフェースしか用意されていませんが、登録サーバーは ユーザー名欄に固定値 __token__ を指定すると、パスワード欄の値をAPIトークンだと認識するようになります

最近はPyPIへの登録には twine そのものを使うよりも PoetryPyflow といったパッケージマネージャーを使う方が主流です。
ここでは使ったことのあるPoetryとtwineのやり方を記載しますが、twineでもPoetryでもPyflowでもユーザー名に __token__ を指定し、パスワードにAPIトークンを指定するのは変わりません。

CLI上でAPIトークンを指定する方法のみ紹介しています。
どちらの場合も設定ファイルに記載しておく方法は存在しますが、git等のファイル管理システムに管理下に(誤って)入ってしまいAPIトークンが外部に晒されてしまう可能性があるので紹介しません。
ファイル管理でやりたい場合は各自検索してみてください。

PoetryでPyPIにAPIトークンを使って登録する

poetry publish --build -u "__token__" -p "<APIトークン>"

TwineでPyPIにAPIトークンを使って登録する

twine upload -u "__token__" -p "<APIトークン>"

おわりに

以上です。