目的
- 僕が、ElectronデスクトップアプリによるOAuthプロセスを知る
うるせえ動くもん見せろ
はい。
ゴール
本稿でやらないこと
- OAuthとはなにかのもっとわかりやすいやつ(こんど別エントリで書きたい)
- 得られたAPI Tokenの永続保存(
electron-json-storage
でも使う) - Expire時のRefreshの実装 (割愛)
参考資料
- Using OAuth 2.0 to Access Google APIs | Google Identity Platform | Google Developers
- Using OAuth 2.0 for Web Server Applications | Google Identity Platform | Google Developers
- OAuth 2.0 for Client-side Web Applications | Google Identity Platform | Google Developers
- OAuth 2.0 for Mobile & Desktop Apps | Google Identity Platform | Google Developers
- GitHub - googleapis/google-api-nodejs-client: Google's officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included.
- GitHub - googleapis/google-auth-library-nodejs: 🔑 Google Auth Library for Node.js
- 2-legged, 3-legged OAuth (本件は3-leggedなので参考程度)
- How is OAuth 2 different from OAuth 1? - Stack Overflow
目次
1. デスクトップアプリの設計概要
こういうものをつくっていきます
- メインのウィンドウでトップ画面が開く
- 「Googleでログイン」的なボタンを押すと別ウィンドウが開く
- そこでGoogleにログインして、権限も許可する
- 成功するとそのウィンドウは消えて、メインのウィンドウで認証情報が得られる
- なんらかのAPI(たとえばYouTube検索API)が使える
みたいな感じで。
2. Google Cloud Console での準備
この手順はもちろん「OAuthプロバイダ」によって操作が異なります
が、
OAuthのプロトコルに則る以上、以下のものを得る・設定する手順には変わりありません
- クライアントID(ひつようですね)
- クライアントシークレット(ひつようですね)
- リダイレクトURI(指定可能だが、登録するひつようがある)
今回は、GoogleをOAuthプロバイダとしてこれをやっていきます。
OAuthプロトコルとしては些末なことなのでここに折りたたんでおきます😉
ⅰ) プロジェクトを作成
- Google Cloud Platform ここに行く
ⅱ) 使う予定のAPIを有効化
ⅲ) (番外)アプリのAPIトークンで最終目的地を確認
これは番外なんですが、とりあえずYouTubeのAPIが叩けることを確認するために、アプリのAPIトークンを作成して、APIが叩けているということをクリアにしておきたい。個人的な性癖です。でもだいじ。こういうのだいじ。
認証情報、から
APIキーのほうを作成して、
で、`curl`で試してみる。
- Search: list | YouTube Data API | Google Developers
User Token の場合は、`Authorization Header`に入れる必要があるが、とりあえずこのAPIを叩けることは確認できた。
ⅳ) OAuthクライアントを登録
このように得られました。
はい!と、いうことでね!上記3点を得ることができました!
3. 最低限のElectronアプリと動線を作成
ファイルぜんぶここで晒すのめんどくさいので、そのdiffをおいておきます。
Implement minimum transitions btw windows · otiai10/electron-playground@7085aed · GitHub
ポイントとしては、Electronにはmainプロセスとrendererプロセスがあり、rendererプロセスを起因としてGoogleの認証画面を開かせる流れなので、
- トップ画面のrendererプロセスは「Googleでログイン」ボタンをきっかけとして、mainプロセスへ
ipcRenderer.send('auth-start')
などのメッセージを送る - mainプロセスは、
ipcMain.on('auth-start', () => ...)
などでその認証プロセスをスタートさせる - トップ画面は
ipcRenderer.on('auth-success, tokens => ...)
などでこのメッセージを受け取る
4. OAuthクライアントの実装
ファイルぜんぶここで晒すのめんどくさいので、そのdiffをおいておきます。
Implement OAuth handshake inside the app · otiai10/electron-playground@5f9b18e · GitHub
ポイントをいくつか列挙すると
- これべんり GitHub - googleapis/google-auth-library-nodejs: 🔑 Google Auth Library for Node.js
- プロバイダ(Google)画面における認証と権限許可が成功したことをデスクトップアプリでどう検知するか
- ウェブサービスであれば、
Callback URL
ないしRedirect URI
などと呼ばれるURLに、ブラウザがリダイレクトされる - ウェブサービスではない。
BrowserWindow
にfile://
から始まるURLにリダイレクトさせることを考えるが、これはプロバイダ側から許可されないことが多い - 苦肉の策ではあるが、
BrowserWindow
のpage-title-updated
イベントを使い、Google上の認証認可が成功したことを検知する
- ウェブサービスであれば、
- 検知したら、
code
を取得し、これをaccess token
と交換してもらう- これは
google-auth-library
がやってくれる。べんり。
- これは
- あとはこれをrendererプロセスへ通知し、rendererプロセスにおいてYouTube Data API / Searchを叩けばよい
完成したものです
雑感
page-title-updated
とかダサすぎか<template>
タグべんりfetch
べんりasync/await
べんり- OAuthについて学んだことをまとめようかと思ったけどちょっとだるいなこれは
- なんか最近「おちついてやる」という能力が板についてきて、よい
- GW長い
- 令和!
DRYな備忘録として