PHPでプロジェクトローカルのパッケージをComposer管理しているとき、Basic認証が掛かったリポジトリからパッケージを取得する方法を説明します。
プライベートなpackageをgitで管理する
Composerでは、packagist.orgで提供されるパッケージ以外にも、satisなどを利用することで社内gitで管理しているプライベートなパッケージなどの管理を行うことができます。
解決策1: composer.jsonに直接USER/PASSを記載する
この時、プロジェクトから該当のリポジトリへアクセスする際に、Basic認証をかけたい場合があります。最も簡単な解決方法は、以下のように認証情報をcomposer.jsonにハードコーディングすることです。
{
"repositories": [
{
"type": "composer",
"url": "http://user:pass@gitrepo.example.org"
}
]
}
このようにすることで、Basic認証がかけられたリポジトリからパッケージを読み込むときに、Composerは自動でbasic認証を行いpackageを持ってくることができます。
しかし、これはcomposer.jsonに認証情報を書きたくない場合には不適切な解決方法です。composer.jsonは通常バージョン管理を行っているため、開発者ごとに別のBasic認証ID/パスワードを管理している場合、全メンバーが共有するcomposer.jsonに情報を管理しておくことできません。
また、そもそも認証に関する情報をgitなどのバージョン管理システムに保存しておくのは望ましい運用方法ではありません。
解決策2: パッケージの取得時に都度、USER/PASSを入力する
別の解決方法としては、認証が必要な時に、ユーザID、パスワードを手入力させる方法もあります。単にcomposer.jsonファイルへユーザ、パスワードの情報を書かないようにしておけば、パッケージのダウンロードを行うときに、都度、ユーザIDとパスワードを尋ねてきます。
この方法だと、パスワード情報をファイルに保存せずに済むのでセキュアです。ただし、jenkinsなどのCIなどでパッケージを自動取得する場合、人手の介入が必要となるこの方法は使えません。
解決策3: auth.jsonを利用する
プロジェクト内にcomposer.json
ファイルに加えてauth.json
ファイルを用意しておき、auth.jsonファイルへ認証情報を書いておくこともできます。auth.jsonの設置場所は、COMPOSER_HOME環境変数で指定されたフォルダ、又はcomposer.jsonと同じフォルダです。
auth.json
ファイルは、hostnameごとに、それぞれのアクセスユーザID,パスワードをペアで記述しておきます。auth.jsonの記述例を以下に示します。
{
"basic-auth": {
"repo.example1.org": {
"username": "my-username1",
"password": "my-secret-password1"
},
"repo.example2.org": {
"username": "my-username2",
"password": "my-secret-password2"
}
}
}
auth.jsonファイルで管理するメリットは、auth.jsonを.gitignoreで管理しておき、認証情報をバージョン管理から外しておけることです。
このようにしておくことで、各開発者がそれぞれ自分PCに設置されたauth.jsonの認証情報をもとにパッケージの配布元へアクセスすることができ、セキュリティ上も好ましい状態になります。
共有のPC上で開発を行っている場合で、ログインユーザごとにauth.jsonの読み取り権限を制限できない場合(WindowsPCなど)、この方法は望ましくありませんが、ログインできるユーザが自分しかいない場合は、これが最も便利な対処方法です。