ChromiumのChrome Sync機能削除と復活方法
背景
ChromiumはGoogleによるオープンソースのWebブラウザーで、Google ChromeやMicrosoft Edge、Vivaldiなどのベースになっています、というのは今更言うまでもないでしょう。
各LinuxディストリビューターはChromiumを独自にパッケージ化し、リポジトリで配布しています。もちろんUbuntuも例外ではなく、Ubuntu 16.04 LTSと18.04 LTS向けにはDebパッケージを、それ以外のバージョンではSnapパッケージを配布しています。詳しくはUbuntu Weekly Recipe 第596回をお読みください。
各Linuxディストリビューターはそれぞれ取得したGoogle APIキーとOauth2クライアントID(とパスワード)を組み込んでパッケージを配布しているため、プロファイルの同期機能であるChrome syncなどを使用することができていました。
1月15日にLimiting Private API availability in Chromiumというブログが公開され、3月15日以降(明日だ!)はこのAPIの使用に制限をかけることが発表されました。すなわち現在組み込まれているのOauth2クライアントIDはユーザーが多く確実に制限に引っかかるので、事実上使い物にならなくなるということです。
Linuxディストリビューターとしては致し方なく、Oauth2クライアントIDを削除するという対応を行うことになりました。Snapパッケージでは3月5日前後に削除されたバージョンがStableチャンネルで配布されています。Debパッケージでは昨日配布されたバージョンから削除されたようです。
設定を見てもログインするメニューがない!
LinuxディストリビューターのOauth2クライアントIDが使えないのであれば、自分でOauth2クライアントIDを取得すればいいのでは? と考えたのでやってみたのがこの記事です。
方針
Ubuntu的にはChromiumのパッケージはSnapで配布しているため、これに独自に取得したOauth2クライアントID(とパスワード)を設定してみます。
そもそもどんなものが埋め込まれていたのかを確認しておきましょう。
google_default_client_id = "424119844901-tilod0e1nm0dt85e1evrdfp3cc3ec01d.apps.googleusercontent.com"
google_default_client_secret = "WCCejhqORuxKG272GAWxsPIU"
とりあえずビルド編
何をするにも、まずはSnapパッケージ版Chromiumがビルドできることを確認しなければいけません。わりと強めなPCを用意して次のコマンドを実行してください。
$ git clone -b stable https://git.launchpad.net/~chromium-team/chromium-browser/+git/snap-from-source
$ cd snap-from-source/
$ sudo snap install snapcraft --classic
$ sudo snap install multipass
$ SNAPCRAFT_BUILD_ENVIRONMENT_CPU=16 SNAPCRAFT_BUILD_ENVIRONMENT_MEMORY=20G snapcraft
Snapパッケージはmultipass上でビルドするのですが(詳しくはUbuntu Weekly Recipe 第656回参照)、割当CPUスレッド数は2、割当メモリーは2GBで超よわよわです。というか普通にビルドがコケるので、環境変数でCPUを16スレッド、メモリーを20GBに増やしています。
ビルドできない理由は基本的にはないはずなので、コケたらリソース配分を疑ってみてください。
従来の方法に戻す編
ビルドがうまくいったとして、次はUbuntuのOauth2を復活させてみましょう。
diff --git a/build/args.gn b/build/args.gn
index 2761286..a529f15 100644
--- a/build/args.gn
+++ b/build/args.gn
@@ -1,4 +1,6 @@
google_api_key = "AIzaSyDGQzx0c0ptZVDriLi9Wblo2voeLnmPq-o"
+google_default_client_id = "424119844901-tilod0e1nm0dt85e1evrdfp3cc3ec01d.apps.googleusercontent.com"
+google_default_client_secret = "WCCejhqORuxKG272GAWxsPIU"
enable_hangout_services_extension = true
enable_mdns = true
enable_nacl = false
このパッチを当てれば復元できるはずです。ビルドしてみましょう
$ snapcraft clean && SNAPCRAFT_BUILD_ENVIRONMENT_CPU=16 SNAPCRAFT_BUILD_ENVIRONMENT_MEMORY=20G snap
craft
できました。インストールしてみましょう
$ sudo snap install ./chromium_(バージョン)_amd64.snap --dangerous
ローカルのパッケージをインストールする場合は"--dangerous"オプションを付けるのがポイントです。
もし過去に一度もChromiumを起動したことがない場合は、パーミッションが全然ないのでつけてやる必要があります。
パーミッションを付けまくる
設定にログインメニューが復活した!
環境変数編
APIキーとOauth2クライアントIDとパスワードは環境変数でも渡せるそうです。実験してみましょう。
diff --git a/snapcraft.yaml b/snapcraft.yaml
index 9123dcd..0d43020 100644
--- a/snapcraft.yaml
+++ b/snapcraft.yaml
@@ -20,6 +20,9 @@ apps:
DISABLE_WAYLAND: 1
CHROME_DESKTOP: chromium.desktop
CHROME_CONFIG_HOME: $SNAP_USER_COMMON
+ GOOGLE_API_KEY: AIzaSyDGQzx0c0ptZVDriLi9Wblo2voeLnmPq-o
+ GOOGLE_DEFAULT_CLIENT_ID: 424119844901-tilod0e1nm0dt85e1evrdfp3cc3ec01d.apps.googleusercontent.com
+ GOOGLE_DEFAULT_CLIENT_SECRET: WCCejhqORuxKG272GAWxsPIU
plugs:
- audio-playback
- audio-record
Snapパッケージではこうやって環境変数を渡すのですね。ではビルドしてみましょう。cleanしなくてもいい気もしますが。
$ snapcraft clean && SNAPCRAFT_BUILD_ENVIRONMENT_CPU=16 SNAPCRAFT_BUILD_ENVIRONMENT_MEMORY=20G snap
craft
できました。インストールしてみましょう
$ sudo snap install ./chromium_(バージョン)_amd64.snap --dangerous
この方法でも同期できることがわかりました。
Oauth2のクライアントIDとパスワードを取得する
おおむねAPI Keysに書いてあるとおりなのですが、有効にするAPIのリストの中にChrome sync APIが含まれていないので、これも忘れずに追加します。
そうだよ君が必要なんだよ!
編集するファイルとビルド方法とインストール方法は省略します。
いざ起動してみると、ログインできるようになっています。もちろん同期もできるようになっています。やった!!
別解として右上のメニューからもログインできる
リリースのたびにビルドすることを考えると頭が痛いですが、ひとまず目標を達成することができました。
その他の方法を考える
こんなめんどくさいことをしなくても、Google Chromeをインストールすればおしまいという話ではありますが、Google Chromeというかプロプラなソフトは使いたくないめんどくさい人はいます。私のことです。
Vivaldiもプロファイルの同期機能があります。Microsoft Edgeには今のところありませんが、今後実装されるのでしょうか?
もちろんFirefoxを使用するというのが第一の解であることに疑いの余地はありません。
さらに次のバージョンのGNOME Web (Epiphany)ではFirefoxの同期機能が使用できるようになる見込みです。
GNOME Web (Epiphany)でFirefox Syncが利用可能に
Ubuntu 18.04 LTSのChromiumのソースコードを取得してビルドし、環境変数で渡すということもできますが、20.04 LTSでビルドを試してみたところdebian/controlを編集する必要があり、何も考えずにビルドとはいきませんでした。そこをクリアしても途中でコケたので、さらに検証を継続する必要がありますが面倒なので諦めました。
Discussion