見出し画像

Strava/Withings Web API開発 - 準備編②

Strava(OAUTH認証)

以下のリンクに纏められています。Strava側のAPIアプリケーション登録や認可コードの発行、アクセストークンの発行の手順が整理されています。
この手順に加えて、認可コードを受け取るためにWebサーバー(IISなど)の準備が必要になります。

①Strava側のAPI利用設定
My API アプリケーションの設定を行います。
Stravaにログオンした上で、以下のURLからアプリケーションの登録を行います。
https://www.strava.com/settings/api
アプリケーション名は適当で構いません。
自分はウェブサイトはhttp://127.0.0.1:80、認証コールバックドメインはlocalhostを設定しました。

アプリケーション登録後、以下の情報が必要となるので控えておきます。
・クライアントID
・クライアントシート


②Webサーバー(IIS)の設定
認可コードを受け取るためにIISの導入が必要となります。
http://www.floatgarden.net/server/windows10_iis_server.html
上記の手順で、IISをインストールしてhttp://127.0.0.1/ もしくは http://localhost/ でIISのサンプル画面が表示されればOKです。


③認可コードの発行

下記URLをブラウザより実行します。

https://www.strava.com/oauth/authorize?client_id=<クライアントID> &response_type=code&redirect_uri=<リダイレクトURL> &approval_prompt=auto &scope=<要求するアクセス権限>

必要なパラメーターは以下の通り。
client_id: クライアントID
response_type: code
redirect_uri: 認証完了後のリダイレクト先のURL
(今回はhttp://127.0.0.1:80/ を指定)
approval_prompt: auto
scope: 要求するアクセス権限を指定
-> 以下の通り参照系のパラメーターを全て指定
scope=read,read_all,profile:read_all,activity:read,activity:read_all
理由は不明ですが、この設定じゃないとトークンのリフレッシュ後にアクセス権限不足となりました。RefreshToken後のAccessTokenで権限不足になりました。

https://www.strava.com/oauth/authorize?client_id=abcde..
&response_type=code&redirect_uri=http://127.0.0.1:80/
&approval_prompt=auto
&scope=read,read_all,profile:read_all,activity:read,activity:read_all

ブラウザから上記URLを入力すると、①で設定したMY APIアプリケーションに対して許可を求められるので、「許可する」を押します。

そうするとリダイレクトURL先へ遷移して、URL上に認可コード(code=xxxxxx...)が表示されます。この値を控えておきます。

IIS画面‗Strava認可コード_LI


④アクセストークンの発行
③で取得した認可コードを使用し、認可サーバにアクセストークンを発行してもらいます。Windowsのコマンドプロンプトの場合は日本語が文字化けしないように、chcp 65001を事前に設定します。

<実行コマンド>

chcp 65001
curl -L -X POST https://www.strava.com/oauth/token?client_id=<クライアントID> -d client_secret=<クライアントシート> -d code=xxxxxxxxxxx -d grant_type=authorization_code

必要なパラメーターは以下の通り。
client_id: クライアントID
client_secret: クライアントシート
code: 認可コード(IISのURLのcode=xxxxxx の値)

<実行結果>

{"token_type":"Bearer","expires_at":1588502646,"expires_in":21600,
"refresh_token":"xxxxx...","access_token":"xxxxx...",
"athlete":{"id":1234567,"username":null,"resource_state":2,
"firstname":"Taroh","lastname":"Yamada","city":"","state":"",
"country":"日本","sex":"M","premium":false,"summit":false,
"created_at":"yyyy-mm-ddThh:mm:ssZ","updated_at":"yyyy-mm-ddThh:mm:ssZ",
"badge_type_id":0,"profile_medium":"https://graph.facebook.com/...",
"profile":"https://graph.facebook.com/...","friend":null,
"follower":null}}

ここで、refresh_tokenとaccess_tokenが発行されます。access_tokenでStrava上の各種データを取得することが可能になり、refresh_tokenでaccess_tokenの期限切れ時の再発行が可能になります。またathlete":{"id" 以降にアスリートIDが表示されるので控えておきます。(この例だと1234567) 


⑤アクセストークンでのデータ取得

以下コマンドでアスリートデータを取得します。

curl -L https://www.strava.com/api/v3/athletes/<自分のアスリートID>?access_token=xxxxxxxxxxxx...

必要なパラメーターは以下の通り。
アスリートID:  athlete":{"id" 以降の値
access_token: アクセストークン

次にアクティビティデータを取得します。

curl -L https://www.strava.com/api/v3/activities/<アクティビティID>
 -H "Authorization: Bearer xxxxxxxx..."

必要なパラメーターは以下の通り。
アクティビティID(※)
Authorization: Bearer : アクセストークン

(※) アクティビティIDは、ブラウザでStravaにアクセスしてURLから確認可能です(URL末尾に番号が振られています。)

以下のようなActivityデータが取得できます。

{"resource_state":3,"athlete":{"id":1234567,"resource_state":1},
"name":"XXXX","distance":15741.9,"moving_time":5616,
"elapsed_time":6884,"total_elevation_gain":242.6,"type":"Run",
"workout_type":null,"id":3349162173,
"external_id":"xxxxxxxx.tcx",
"upload_id":1234567890,"start_date":"yyyy-mm-ddThh:mm:ssZ",
"start_date_local":"yyyy-mm-ddThh:mm:ssZ",
"timezone":"(GMT+09:00) Asia/Tokyo","utc_offset":32400.0,
"start_latlng":[35.123456,139.12345],"end_latlng":[35.123456,139.12345],
"location_city":null,"location_state":null,"location_country":"xx",
"start_latitude":35.678901,"start_longitude":139.78901,
"achievement_count":2,"kudos_count":4,"comment_count":0,
"athlete_count":1,"photo_count":0,"map":
{"id":"a1234567890","polyline":"xxxxxxxxxx"  ...

この例だと、"distance":15741.9、"type":"Run" となっているので、15.7kmのランニングだと分かります。

⑥アクセストークンの再発行(リフレッシュトークンを使用
トークンの有効期限が切れた場合は認可サーバに再度アクセストークンの発行を依頼します。この時に「リフレッシュトークン」が必要となります。

 curl -X POST https://www.strava.com/api/v3/oauth/token -d client_id=<クライアントID> -d client_secret=<クライアントシート> -d grant_type=refresh_token -d refresh_token=<リフレッシュトークン>

必要なパラメーターは以下の通り。
client_id: クライアントID
client_secret: クライアントシート
grant_type: refresh_token(固定)
refresh_token: リフレッシュトークン

このコマンド実行で、アクセストークン/リフレッシュトークンが再発行されます。

{"token_type":"Bearer","access_token":"xxxxxxxxxxxxxxxxxxx",
"expires_at":1541513430,"refresh_token":"xxxxxxxxxxxxxxxxxxx"}

Withings(OAUTH認証)もほぼ同様の手順です。

(続く)


<関連記事>
Strava/Withings Web API開発(天気と走行距離と体重をダッシュボードで表示してみた)
https://note.com/sanoatsu/n/nbe00ce35d3b1
Strava/Withings Web API開発 - 全体概要
https://note.com/sanoatsu/n/ncc074b9ce5f7
Strava/Withings Web API開発 - 準備編①
https://note.com/sanoatsu/n/n0104f85631cf
Strava/Withings Web API開発 - 準備編③
https://note.com/sanoatsu/n/nb60129601d54

Strava/Withings Web API開発 - リファレンス(Web API認証)
https://note.com/sanoatsu/n/n98742c974b17


よろしければサポートお願いします。