OAuthのやり方
Google APIを使用するには認証をする必要が有ります。パソコンであるのならブラウザでID/PASSを入力するのですが、RaspberryPiには標準ではディスプレイがありません。ではどうすれば良いのでしょうか?
今回はこちらを参考にしました。
OAuthのやり方は右図を見ると分かり易いですね。
- Androidですか?iOSか? → いいえ、違います
- ブラウザがありますか? → いいえ、ありません
つまり、「Using OAuth 2.0 for Devices」となるのです。
Step1. Client ID と Client secret の作成
ここから、実際にGoogleAPIを呼ぶための準備等を行っていきます。
- Google Developers Consoleにアクセス。
- Create Project
- 左のメニューから APIs & auth -> credential 選択
- Create new Client ID ボタンクリック
- Installed Application -> Other -> Create Client ID 選択
- 作る際にConsent screenの入力を求められるかもしれません。その際は適当に入力してください。
- Client ID と Client secret の出来上がり
Step2. ユーザコードの取得
https://accounts.google.com/o/oauth2/device/code に対してPOSTリクエスト
- Hedaer: 'Content-Type: application/x-www-form-urlencoded'
- Parameter: client_id={Step1で取得したClientID}
- Parameter: scope={こちらを参照}
$ curl -d "client_id={Client ID}&scope={scope}" https://accounts.google.com/o/oauth2/device/code
※scopeが複数ある場合は空白でつなげる
レスポンス
{
"device_code" : "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
"user_code" : "GQVQ-JKEC",
"verification_url" : "https://www.google.com/device",
"expires_in" : 1800,
"interval" : 5
}
Step3. デバイスの承認
このステップはご自身のパソコンで行ってください。
- Step2でのレスポンス内の
verification_url
の内容にブラウザでアクセス
- 「Enter the code displayed by your device:」と表示されますので、Step2でのレスポンスの
device_code
ではなく user_code
を入力してください。
- あとは指示の通りに進んでください
Step4. アクセストークンの取得
https://www.googleapis.com/oauth2/v3/token に対してPOSTリクエスト
- Header: 'Content-Type: application/x-www-form-urlencoded'
- Parameter: client_id={Step1で取得したClientID}
- Parameter: client_secret={Step1で取得したClient secret}
- Parameter: code={Step2でのレスポンスの
device_code
}
- Parameter: granttype='http://oauth.net/granttype/device/1.0'
$ curl -d "clientid={Client ID}&clientsecret={Client secret}&code={devicecode}&granttype=http://oauth.net/grant_type/device/1.0" https://www.googleapis.com/oauth2/v3/token`
レスポンス
{
"access_token" : "ya29.AHES6ZSuY8f6WFLswSv0HELP2J4cCvFSj-8GiZM0Pr6cgXU",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/551G1yXUqgkDGnkfFk6ZbjMLMDIMxo3JFc8lY8CAR-Q"
}
Step5. Google Calender API呼び出し
アクセストークンをパラメータに設定してリクエストを出せば結果が返ってきます。
例) ある特定の日のイベントを取得する。
https://www.googleapis.com/calendar/v3/calendars/{CalendarID}/events?singleEvents=true&orderBy=startTime&timeMin=2015-07-14T00%3A00%3A00.000Z&timeMax=2015-07-15T00%3A00%3A00.000Z&key={access_token}
Calendar APIに関してはこちらのリファレンスページをご参照下さい
さいごに
これでブラウザを持たないデバイスでのGoogle APIの呼び出しができました。アクセストークンには有効期限が有りますので、期限が切れてしまったらリフレッシュトークンを使って更新を行ってください。
Google Calendar APIで予定は取得できるようになったのですが、まだディスプレイが届いていないので実際のモノは作れていません(ToT)。またモノができましたら記事を書くかもしれませんのでお待ちください。
Email: yanou at atware.co.jp