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ならウェブビューを表示できるみたいですね。知らなかったです。
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を記述して起動すると次のようなウィンドウが表示されます。
このmacOSアプリは自分のGitHubアカウントにGitHub Appをインストールし、GitHub Appユーザーアクセストークンを使ってログインしたユーザーのアカウント名を表示するだけの簡単なものです。GitHub Appのユーザーアクセストークンについて詳しくはGitHubアプリのユーザーアクセストークンの生成を見てください。インストールしたGitHubアプリはAuthorized GitHub Apps設定からRevokeすることができます。
ボタンをクリックするとWebAuthenticationSessionを使ってGitHubのアプリの認可画面を開きます。筆者のデフォルトブラウザはFirefoxなのですが、どうやらFirefoxは(AS)WebAuthenticationSessionには対応してないようでSafariで開くかどうかを確認するポップアップが表示されます。
このポップアップで「続ける」を選ぶとGitHubが表示されます (キャンセルするとアプリにエラーが返される)。このときすでにSafariでウィンドウを開いている場合でも新規タブで開かれることはなく、新たなウィンドウで開かれるようです。
またプライベートウィンドウのように完全にログアウトされた状態ではなくすでに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のときと同じですね。
Microsoft Edge
Google Chromeと同様にMicrosoft EdgeもWebAuthenticationSessionに対応しているようです。ウィンドウの見た目もGoogle Chromeとほとんど同じのようです。
まとめ
macOSのGUIアプリでも(AS)WebAuthenticationSessionを使うことでWebビューでの認証・認可を行うことができることがわかりました。カスタムURLスキーマを利用したredirect_uriへのリダイレクトの場合、利用者に問い合わせることなく元のアプリにリダイレクトしてくれます。先にサーバーとして適当なTCPポートでリッスンしておき、リダイレクトURLを http://localhost:(リッスンしているポート)
とするよりも簡単だと感じました。
macOSの場合、利用者のデフォルトブラウザがASWebAuthenticationSessionに対応していればデフォルトブラウザの新規ウィンドウで指定したURLが開かれますが、非対応の場合はSafariで開かれます。利用者がSafari, Google Chrome, Microsoft Edgeをデフォルトブラウザに指定している場合は普段のブラウザで開かれますが、Firefoxのように未対応のブラウザもあるため注意が必要です。
リンク
- https://github.com/mtgto/ExampleWebAuthenticationSession 今回のサンプルアプリのソースソースコード
- https://github.com/apps/ExampleWebAuthenticationSession サンプルアプリのために作成したGitHubアプリ
Discussion