Fitbitのアクセストークンを取得する

## 概要
- Fitbitのデータを取得するためのアクセストークンを取得する方法の備忘録です。


## アカウント作成＆ログイン

- [Fitbit developer](https://dev.fitbit.com/)へアクセス
- Manage -> Register An App をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/03ec981b-496a-8ac0-0e8a-efebcdd0a8ec.png)
  
- Log In をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/e5c84d78-c790-ecf0-b9c7-be376bb41b95.png)

- アカウントを作成し、SIGN IN する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/2be3d37a-3586-b5c2-9a3d-25cc6e290c87.png)

## アプリの登録
- 以下の設定値で登録する。なお、★の項目は、アクセストークン取得には影響しないので、別のURLでもOKです。
    - Application Name
        - 任意の内容でOK
    - Description
        - 任意の内容でOK
    - Application Website URL ★
        - http://localhost:8080/
    - Organization
        - 任意の内容でOK
    - Organization Website URL ★
        - http://localhost:8080/
    - Terms of Service URL ★
        - http://localhost:8080/
    - Privacy Policy URL ★
        - http://localhost:8080/
    - OAuth 2.0 Application Type
        - Personal を選択する
    - Redirect URL
        - http://localhost:8080/
        - アクセストークン取得時にこのURLへリダイレクトします。
    - Default Access Type
        - Read Only
  
- 必要項目を入力し、Register をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/122e6608-f8f3-134c-d618-ac3930a547d3.png)
  
  
- アプリの登録完了。
- `OAuth 2.0 Client ID` と `Client Secret` はアクセストークン取得後のアクティビティデータ取得時に使うので、メモっておきましょう。(この画面に来れば後からでも確認できます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/de7aa45d-04c3-9def-90c9-66815ecc997e.png)


## アクセストークンの発行・取得
- OAuth 2.0 tutorial page をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/34d4609b-38eb-c16d-8cd6-96434a8fd1d5.png)

- 1: Authorize の Flow type は推奨されている `Authorization Code Flow` を選択。
- アプリのデータが入力されているが、編集は不要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/d775cc89-c65c-a1ba-99cd-2f40734a5eca.png)

- Scopeはお好みに応じてチェックを外す。今回はフルチェックのままにします。
- ExpireTimeはデフォルト設定でOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/d5f5e66d-d4d3-3958-3611-91f16f7a0d82.png)

- 生成された認証URLをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/114b1c1f-40dc-7f9c-dec1-d1cae9a53472.png)

- データのアクセス許可項目を選択し、許可をクリック。(今回はすべてを許可します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/0d8f8be6-fe81-f5a3-66cf-c85b8031cdf5.png)

- アプリ作成時に設定したRedirect URLへリダイレクトするので、URLの中のcode部分をコピーする
- 例: http://localhost:8080/?code=00a30fXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#_=_
    - ここの `00a30fXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` がcodeです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/8902b3d2-5ab5-5263-3051-4cf6e781f197.png)

- OAuth 2.0 tutorial page のタブへ戻り、1A Get Code -> Code に先ほどコピーしたcodeをペーストする。
- すると、アクセストークンを取得するためのcurlコマンドが表示される。
```terminal:表示されたcurl
curl -i -X POST \
 -H 'Authorization: Basic YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' \
 --data "clientId=IIIIIIII" \
 --data "grant_type=authorization_code" \
 --data "redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F" \
 --data "code=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
 -H 'Content-Type: application/x-www-form-urlencoded' \
https://api.fitbit.com/oauth2/token
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/d541b2d5-d4e1-ad0b-efbd-d216ad5b5bfc.png)

- 表示されているcurlコマンドをターミナル等に入力すると、アクセストークンを含んだResponseを受信できる。
- VSCodeのターミナルでこのままコピペしてもエラーになる場合は、[以前書いたcurlコマンドの記事](https://qiita.com/zono345/items/4427fd7a24c68581fa6b)の方法で入力すればOK

```terminal:受信したResponse
HTTP/1.1 200 OK
Date: Tue, 08 Nov 2022 07:22:09 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Origin,Accept-Encoding
Cache-control: no-cache, private
Set-Cookie: fct=ZZZZZZZZZZZZZZZZZZZZZZZZZZ; Path=/; Secure; HttpOnly
Set-Cookie: JSESSIONID=JJJJJJJJJJJJJJJJ.fitbit1; Path=/; Secure; HttpOnly
Content-Language: ja-JP
X-Frame-Options: SAMEORIGIN
Via: 1.1 google
CF-Cache-Status: DYNAMIC
Server: cloudflare
CF-RAY: 766c8e518e7ae045-NRT

{"access_token":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa","expires_in":28800,"refresh_token":"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr","scope":"heartrate sleep profile settings temperature nutrition activity respiratory_rate location social weight oxygen_saturation","token_type":"Bearer","user_id":"xxxxxxxxxxxxxxx"}
```
  

- 主要な項目の説明です。
    - `access_token` : アクセストークン
    - `expires_in` : アクセストークンの有効期間(秒)。デフォルト設定(変更不可)は288,800秒＝8時間。
    - `refresh_token` : 有効期間が切れたアクセストークンを更新・再取得する際に必要なリフレッシュトークン。
   
- お疲れ様でした。無事、アクセストークンの取得完了です。  

## 参考リンク ##
- 公式ドキュメントの内、以下のドキュメントは一読をおすすめします。
[Fitbit - developer - Authorization](https://dev.fitbit.com/build/reference/web-api/authorization/)
[Authorize](https://dev.fitbit.com/build/reference/web-api/authorization/authorize/)
[OAuth2 Token](https://dev.fitbit.com/build/reference/web-api/authorization/oauth2-token/)
[Refresh Token](https://dev.fitbit.com/build/reference/web-api/authorization/refresh-token/)