NextCloudのAPIを使う時に、ユーザー名・パスワードの代わりに「アプリパスワード」を使うことができます。これはユーザー自身が設定画面から作成できるものです。
……でも今の時代、もうちょっとスマートにやりたくないですか。
そんなあなたに Login flow v2。
これを使うと以下のような流れでアプリパスワードを取得できます。
- アプリ側で「NextCloudでログイン」的なボタンを押す
- アプリに表示されたURLをブラウザで開く
- ブラウザでNextCloudにログインして、アクセスを許可する
- アプリに戻るとログインが完了している 🎉
以降、順を追って紹介します。
注意
この記事は Nextcloud 20.0.5 で動作確認しながら書いています。
バージョン違いなどで動作が異なる場合は、以下の公式ドキュメントを参照してください。
1. トークンとログインURLを取得
まず /login/v2
にPOSTします。この時の User-Agent がアプリ名として確認画面やセッション一覧に表示されるので、いい感じの値を設定しておきましょう。
※以降、example.comの部分は適当に読み替えてください。index.phpが必要な場合は足してください。
$ curl -A "myapp/1.2" -X POST http://example.com/login/v2
{
"poll": {
"token": "wsEf...HfkC",
"endpoint": "http://example.com/login/v2/poll"
},
"login": "http://example.com/login/v2/flow/q2P6...DS5U"
}
poll
の中身はあとで結果をポーリングする時に使うので取っておきます。 login
に入っているURLをユーザーに伝えて、開いてもらいます。
2. ブラウザでアクセスを許可する
1で得られたURLにユーザーがアクセスすると、以下のように画面が遷移していきます。
これでアプリパスワードの発行が行われました。設定 → セキュリティ を見ると、画面で生成したのと同じように一覧に表示されています。
3. アプリパスワードを取得する
1で取っておいた poll
の情報を使います。 poll.endpoint
に入っていたURLに対して、 token=<poll.tokenの値>
という形でクエリパラメータをつけてPOSTすると、ユーザー名とアプリパスワードが得られます。
$ curl -A "myapp/1.2" -X POST http://example.com/login/v2/poll -d "token=wsEf...HfkC"
{
"server": "http://example.com",
"loginName": "testuser",
"appPassword": "8Ekh....Zu4n"
}
このとき、アクセスの許可が済んでいない場合は404レスポンスが帰ってきます。
ユーザーにURLを提示してすぐポーリングを始める場合は404が帰ってくる間リトライを続けることになります。
4. アプリパスワードでAPIを呼び出す
あとはこのユーザー名とアプリパスワードをBASIC認証に指定すれば、APIを呼び出せます。
例えばWebDAVを使うならこんな感じに。
$ curl -A "myapp/1.2" -u "testuser:8Ekh...Zu4n" http://example.com/remote.php/dav/files/testuser/path/to/file