3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PasonaTechAdvent Calendar 2021

Day 13

fitbitでざっくり理解するOAuth2

Posted at

はじめに

OAuth2ってなにそれおいしいの?から、「完全に理解した」(つまり、なんとなくわかる程度)になるための手助けのひとつとなるのは、やっぱり使ってみること。
そんなときちょうどいい題材としてfitbitを使ってみましょう、ということでさっと使うところまで。なので、OAuth2についての詳しい解説はほかにさんざん良い記事やrfcの解説がありますので、ここでは行いません。
またあくまで使う側(クライアント側)としての内容なので、認可サーバーやリソースオーナー側については言及しません。

なぜfitbit?(だって資料が豊富だから)

なんだかんだで、公式ドキュメント。

あとはサンプルコード1があるので、大抵の内容はこのあたりでカバーできます。

またOAuth2.0のチュートリアルなんてページまで用意してくれています。

データの取得については、公式が用意してくれているSwagger(OpenAPI)ですべて試せます。
ここでどんなjsonが落ちてくるか眺めながらなにを使うか考えていきます。

このあたりまでで目的が達成できる方は、以下を読む必要ありません。

準備

ここから下が、この記事の本題です。

まず登場人物は、ここで定義される、リソースオーナー、リソースサーバー、クライアント、認可サーバーです。

fitbitのデータを持っているエンドユーザ(つまりあなた)は、リソースオーナーです。
fitbitのサーバーは、データを管理するリソースサーバーと、データへのアクセスを許可する認可サーバーの役割を果たします。
クライアントは、リソースオーナーの許可を得てリソースにリクエストするアプリケーションです。

事前準備として、Register an applicationから、データを取得するアプリケーションを追加、つまりクライアントを登録して、一意となるCLIENT_IDを発行しておく必要があります。

データに対するアクセス許可

ここの操作は、すべてクライアントがリソースにアクセスするための手続きです。
よく使われている(んじゃないかと思う)Pythonのサンプルをベースに、なにをやっているかを説明します。

1. 認可サーバーへのリクエスト発行

クライアント識別子を使って一意に指定されるクライアントは、authorize_token_urlメソッドを使用して、認可サーバーの/oauth2/authorizeに対してリクエストを発行します。

# サンプル
https://www.fitbit.com/oauth2/authorize?client_id=ABC123&response_type=code
&scope=weight%20location%20settings%20profile%20nutrition%20activity%20sleep
%20heartrate%20social

未ログインの場合はログインを挟んで、認可サーバーではリソースオーナーがクライアントにアクセス許可を与えるページに遷移します。

2. 認可サーバーからクライアントへのリダイレクト

画面で許可操作を行うと、クライアントのアプリケーションが用意している画面にリダイレクトされます。リダイレクト先は、authorizeのパラメータとしての送るredirect_urlと、準備で登録したurlが一致している必要があります。
リダイレクトをうけとったクライアントは、リダイレクトURLに含まれる認可コードを使用してトークンをリクエストします。

3. アクセストークンのリフレッシュ

アクセストークンは有効期限が定められているので、定期的にリフレッシュトークンを利用して、再発行が必要です。

{
    "access_token": "<access_token>",
    "expires_in": 28800,
    "refresh_token": "<refresh_token>",
    "scope": "social settings heartrate nutrition sleep activity profile location weight",
    "token_type": "Bearer",
    "user_id": "<user_id>"
}

おわりに

なお実はPythonのサンプルの中ではPKCEを使用していません。セキュリティを強化するためには、PKCEに対応した処理を追加することが望ましいかと思います。

  1. たいへん残念なことにRubyのサンプルへのリンクがなかったのが、みつけたものにリンクしておきます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?