🔑

macOSでWebAuthenticationSessionを使ってみる

に公開

iOS (12+) でのWebサービスの認証を行うページを開く際にはAuthenticationService FrameworkのASWebAuthenticationSessionを使うことが推奨されています。

このAppleのAPIドキュメントを見ていたところ、iOSだけではなくmacOS (10.15+) やtvOS (16.0+)、visionOS (1.0+), watchOS (6.2+) にまで対応していることを知りました。
watchOSってWKWebViewを使うことはできないはずなんですが、ASWebAuthenticationSessionならウェブビューを表示できるみたいですね。知らなかったです。
https://mntone.hateblo.jp/entry/2021/11/17/111553

macOSでASWebAuthenticationSessionを利用する場合、デフォルトのブラウザが対応していればデフォルトのブラウザで、対応してなければSafariが使われるそうです。

In macOS, the system opens the user’s default browser if it supports web authentication sessions, or Safari otherwise.

macOSでのASWebAuthenticationSessionを使ったアプリケーションを作って実際に対応しているブラウザはあるのかを調べてみました。

動作確認環境

  • macOS 15.4
  • Safari 18.4
  • Firefox 137.0.1
  • Google Chrome 135.0.7049.85
  • Microsoft Edge 135.0.3179.73

WebAuthenticationSessionを使ったmacOSアプリを作る

ASWebAuthenticationSessionのSwiftUI版であるWebAuthenticationSessionを使ってGitHub Appをインストールしてユーザーアクセストークンを取得する簡単なmacOSアプリをSwiftUIで作ってみました。ソースコードは https://github.com/mtgto/ExampleWebAuthenticationSession にあります。

Config.xcconfig にGitHub App ExampleWebAuthenticationSession のClient Id, Client Secretを記述して起動すると次のようなウィンドウが表示されます。

ExampleWebAuthenticationSessionの初期起動ウィンドウ

このmacOSアプリは自分のGitHubアカウントにGitHub Appをインストールし、GitHub Appユーザーアクセストークンを使ってログインしたユーザーのアカウント名を表示するだけの簡単なものです。GitHub Appのユーザーアクセストークンについて詳しくはGitHubアプリのユーザーアクセストークンの生成を見てください。インストールしたGitHubアプリはAuthorized GitHub Apps設定からRevokeすることができます。

ボタンをクリックするとWebAuthenticationSessionを使ってGitHubのアプリの認可画面を開きます。筆者のデフォルトブラウザはFirefoxなのですが、どうやらFirefoxは(AS)WebAuthenticationSessionには対応してないようでSafariで開くかどうかを確認するポップアップが表示されます。

Safariでgithub.comを開く許可を求めるポップアップ

このポップアップで「続ける」を選ぶとGitHubが表示されます (キャンセルするとアプリにエラーが返される)。このときすでにSafariでウィンドウを開いている場合でも新規タブで開かれることはなく、新たなウィンドウで開かれるようです。

Safariで開かれたGitHubアプリの認可画面

またプライベートウィンドウのように完全にログアウトされた状態ではなくすでにSafariでGitHubにログインしていた場合はログインセッションがそのまま利用されるようです。

利用者が Authorize ExampleWebAuthenticationSession をクリックした場合、カスタムURLスキーマ net.mtgto.examplewebauthenticationsession:// にアクセストークンの発行に必要なcodeなどのクエリパラメータがついたURLにリダイレクトされます。このとき「このカスタムURLスキーマに対応したアプリを開きますか?」などとブラウザに聞かれることはなく、シームレスに元のアプリに処理が戻るようになっています。またAuthorizeを押した場合もCancelを押した場合も認可のために表示されていたウィンドウはクローズされるようです (キャンセルした場合はアプリにエラーが返される)。

いろいろなブラウザで試す

どうやらmacOSの場合、FirefoxをデフォルトブラウザにしていてもSafariで開かれるようでした。他のブラウザではどうでしょうか。著名なブラウザが対応しているのか実験してみましょう。

Google Chrome

Google Chromeがデフォルトブラウザの場合はGoogle Chromeで認可画面が開きました。
よく見るとSafariと違って、アドレスバーがあったりtitleタグのテキストがタイトルバーに表示されているようです。GitHubにログイン済みの場合はサインインからではなく認可画面から開始するのもSafariのときと同じですね。

Google chromeでgithub.comを開く許可を求めるポップアップ
Google Chromeで開かれたGitHubアプリの認可画面

Microsoft Edge

Google Chromeと同様にMicrosoft EdgeもWebAuthenticationSessionに対応しているようです。ウィンドウの見た目もGoogle Chromeとほとんど同じのようです。

Microsoft Edgeでgithub.comを開く許可を求めるポップアップ
Microsoft Edgeで開かれたGitHubアプリの認可画面

まとめ

macOSのGUIアプリでも(AS)WebAuthenticationSessionを使うことでWebビューでの認証・認可を行うことができることがわかりました。カスタムURLスキーマを利用したredirect_uriへのリダイレクトの場合、利用者に問い合わせることなく元のアプリにリダイレクトしてくれます。先にサーバーとして適当なTCPポートでリッスンしておき、リダイレクトURLを http://localhost:(リッスンしているポート) とするよりも簡単だと感じました。

macOSの場合、利用者のデフォルトブラウザがASWebAuthenticationSessionに対応していればデフォルトブラウザの新規ウィンドウで指定したURLが開かれますが、非対応の場合はSafariで開かれます。利用者がSafari, Google Chrome, Microsoft Edgeをデフォルトブラウザに指定している場合は普段のブラウザで開かれますが、Firefoxのように未対応のブラウザもあるため注意が必要です。

リンク

Discussion