created: 2020-04-16T11:41:10.000Z

WithingsAPIのトークンのを取得

トークンの取得

codeを取得

管理画面から CLIENT_ID , CONSUMER_SECRET を発行する

export CLIENT_ID=xxxx
export CONSUMER_SECRET=xxxxxxxx
export REDIRECT_URL=http://localhost:8000
export SCOPE=user.info,user.metrics,user.activity,user.sleepevents
export STATE=sakamoto  # リクエストが重複しないようにするためのなんでもいい文字列

ブラウザで開いて アプリを許可する

open "https://account.withings.com/oauth2_user/authorize2?response_type=code&client_id=$CLIENT_ID&state=$STATE&scope=$SCOPE&redirect_uri=$REDIRECT_URL"

REDIRECT_URL で定義したURLへリダイレクトされる
そのクエリパラメータに code が入っている

http://localhost:8000/?code=xxxx&state=akira

トークンの取得

POSTしたらJSONが返ってくる

export CODE=xxxxxxxxxxxx
curl https://account.withings.com/oauth2/token \
  -d 'grant_type=authorization_code' \
  -d "client_id=$CLIENT_ID" \
  -d "client_secret=$CONSUMER_SECRET" \
  -d "code=$CODE" \
  -d "redirect_uri=$REDIRECT_URL"
{
  "access_token": "xxxxxxxxxx",
  "expires_in": 10800,
  "token_type": "Bearer",
  "scope": "user.info,user.metrics,user.activity,user.sleepevents",
  "refresh_token": "xxxxxxxxxxxxxxxxxxxx",
  "userid": "xxxxxxxxxx"
}

トークンの更新

トークンは3時間で使えなくなる
refresh_tokenを使って新しいのをゲットする

curl https://account.withings.com/oauth2/token \
  -d 'grant_type=refresh_token' \
  -d "client_id=$CLIENT_ID" \
  -d "client_secret=$CONSUMER_SECRET" \
  -d "refresh_token=$REFRESH_TOKEN"

こんなスクリプトを書いてなんとかした

#!/usr/bin/env bash
# usage: $ direnv exec bin/refresh-token.sh
set -eux
cd $(dirname $0)/../

export REFRESH_TOKEN=$(cat token | jq -r .refresh_token)
curl -s https://account.withings.com/oauth2/token \
  -d 'grant_type=refresh_token' \
  -d "client_id=$CLIENT_ID" \
  -d "client_secret=$CONSUMER_SECRET" \
  -d "refresh_token=$REFRESH_TOKEN" | jq . | tee ./token