🔐

自分用クラウドドライブ「OpenCloud」を「Pocket ID」と組み合わせてパスキー認証できるようにする

に公開

はじめに

これまで何回か、自分用クラウドドライブ「OpenCloud」と、シンプルに使えるID Provider(IDP)「Pocket ID」を紹介してきました。

https://zenn.dev/moba_gadgets_x/articles/08db19bc71eccc
https://zenn.dev/moba_gadgets_x/articles/34c1475f311bac
https://zenn.dev/moba_gadgets_x/articles/62408e5f89a37b

今回はいよいよ、Pocket IDでパスキー認証してOpenCloudを使えるように設定していきます。

Pocket IDの環境設定

OpenCloudからの連携を受け付けるように、Pocket IDを設定します。

Pocket IDにOpenCloudのアプリを登録

Pocket IDの管理画面にログイン後、「Administration」-「OIDCクライアント」から、OpenCloudで利用するクライアントを登録します。設定内容の詳細はOpenCloudのドキュメントに記述されています。

設定内容の詳細は以下の通り。名前はお好みでつけて良いです。なお、すべてに共通して、「Public Client」を有効にします(このとき「PKCE」が自動的に有効になります)。

【Web用】

  • Client ID: web
  • Callback URLs
    • https://your-domain.example.com/
    • https://your-domain.example.com/oidc-callback.html
    • https://your-domain.example.com/oidc-silent-redirect.html

https://your-domain.example.com/は、OpenCloudをホストするURLです。

【デスクトップクライアント用】

  • Client ID: OpenCloudDesktop
  • Callback URLs
    • http://127.0.0.1
    • http://localhost

【Androidアプリ用】

  • Client ID: OpenCloudAndroid
  • Callback URLs
    • oc://android.opencloud.eu
  • Logout Callback URLs
    • oc://android.opencloud.eu

【iOSアプリ用】

  • Client ID: OpenCloudIOS
  • Callback URLs
    • oc://ios.opencloud.eu
  • Logout Callback URLs
    • oc://ios.opencloud.eu

ユーザーグループの登録

「Administration」-「ユーザーグループ」に、以下の通り登録します。Friendly Nameはなんでもいいのですが、そこそこわかりやすいように。

Friendly Name 名前
admin user group opencloudAdmin
space admin user group opencloudSpaceAdmin
user group opencloudUser
guest group opencloudGuest

各ユーザーグループを登録後、「カスタムクレーム」を開いて、「roles」に先ほどの「名前」と同じ内容を入力します。

「admin user group」を選択して、自分自身を割り当てておきます。

OIDCクライアントをもう一度開いて、「許可されたユーザーグループ」で、登録したユーザーグループをすべてチェックします。自分しか使わないなら「制限なし」にしてもよいです。

OpenCloudの環境設定

OpenCloud側も、Pocket IDと連携できるように設定します。

環境変数

環境変数ファイル.envを作成し、以下内容を記述します。your-domain.example.comがOpenCloudのドメイン名、pocket-id.your-domain.example.comがPocket IDのドメイン名です。

OC_URL=https://your-domain.example.com
PROXY_AUTOPROVISION_ACCOUNTS=true
PROXY_ROLE_ASSIGNMENT_DRIVER=oidc
OC_OIDC_ISSUER=https://pocket-id.your-domain.example.com
PROXY_OIDC_REWRITE_WELLKNOWN=true
PROXY_USER_OIDC_CLAIM=preferred_username
OC_EXCLUDE_RUN_SERVICES=idp
PROXY_CSP_CONFIG_FILE_LOCATION=/PATH/TO/csp.yaml

CSP設定

csp.yamlの内容は以下の通り。ownCloud Infinite Scale(OCIS)のリポジトリから設定を抜いてきたので、OCISだけで必要とする余分な設定もあるかも。本質的な変更は(1)で、(2)はCSPのエラーを抑止するため修正しました。

directives:
  child-src:
    - '''self'''
  connect-src:
    - '''self'''
    - 'blob:'
    - 'https://raw.githubusercontent.com/owncloud/awesome-ocis/'
    # In contrary to bash and docker the default is given after the | character
    - 'https://pocket-id.your-domain.example.com/' # この行を追加 ...(1)
  default-src:
    - '''none'''
  font-src:
    - '''self'''
  frame-ancestors:
    - '''self''' # noneから修正 ...(2)
  frame-src:
    - '''self'''
    - 'blob:'
    - 'https://embed.diagrams.net/'
  img-src:
    - '''self'''
    - 'data:'
    - 'blob:'
    - 'https://raw.githubusercontent.com/owncloud/awesome-ocis/'
  manifest-src:
    - '''self'''
  media-src:
    - '''self'''
  object-src:
    - '''self'''
    - 'blob:'
  script-src:
    - '''self'''
    - '''unsafe-inline'''
  style-src:
    - '''self'''
    - '''unsafe-inline'''

Pocket IDとOpenCloudを起動して表示してみる

Pocket IDは普通に./pocket-idとかで実行すればよいです。OpenCloudは、先ほど設定した.envを読み込んでから実行します。

export $(cat .env | grep -v ^#)
./opencloud server

OpenCloudのURLにアクセスすると、自動的にPocket IDのページにリダイレクトされます。

「サインイン」ボタンをクリックすると、パスキーによる認証が行われます。Windowsに登録されたパスキーならばこんな感じ。

暗証番号などを入力すると、最初の1回だけ次の画面になるので、そのまま「サインイン」をクリックします。

しばらくしてOpenCloudの画面に戻ってきます。なお、初回ログイン時に、OpenCloudのアカウントが自動的に作成されます。

まとめとおまけ

まとめ

Pocket IDとOpenCloudを連携させて、パスキーによる認証ができるようにしました。記事4本を要する、そこそこ長い旅でしたが、自分専用のクラウドドライブが欲しい方は試す価値があるかと存じます。皆様の参考になれば幸いです。

おまけ:systemdによる自動起動の設定

継続して使い続けるならばsystemdで自動起動を設定すると便利でしょう。参考までに、自分が使っているsystemdの設定を(無保証という前提で)以下にのせておきます。/PATH/TOUSERNAMEGROUPNAMEは環境に合わせて調整してください。

【Pocket ID:/usr/lib/systemd/system/pocket-id.service

[Unit]
Description = "Pocket ID"
After = network.target

[Service]
WorkingDirectory = /PATH/TO/pocket-id
ExecStart   = /PATH/TO/pocket-id/pocket-id
Type        = simple
User        = USERNAME
Group       = GROUPNAME
Restart = on-failure
RestartSec = 5s

[Install]
WantedBy    = default.target

【OpenCloud:/usr/lib/systemd/system/opencloud.service

[Unit]
Description = OpenCloud
After = network.target

[Service]
WorkingDirectory = /PATH/TO/opencloud
ExecStart   = /PATH/TO/opencloud/opencloud server
EnvironmentFile = /PATH/TO/opencloud/.env
Type        = simple
User        = USERNAME
Group       = GROUPNAME
Restart = on-failure
RestartSec = 5s

[Install]
WantedBy    = default.target

Discussion