ITお絵かき修行

3歩歩いても忘れないために

Strava V3 APIの認可方式(OAuth2)を試す

www.strava.com

Stravaでは開発者用APISDKが公開されており、自分の記録などをAPI越しに覗くことができる。ただ2018/10/15よりAPIの認可方式が変更となった。
https://developers.strava.com/docs/changelog/

今までは有効期限なしのアクセストークンを用いた認可方式だったが、今後は短命なアクセストークンを使用したOAuth2ベースの認可方式へ変更となる。(2019年10月で完全移行の模様。移行ガイドも提供されている)

Prior to this date, anytime an athlete granted access to an application, that app received an access token with no expiration date (also called “forever tokens”). Starting on October 15, 2018, the OAuth endpoints should be used to obtain short-lived access tokens and refresh tokens instead. While the forever tokens will continue to work through October 15, 2019, all applications should be migrated to the new refresh token pattern as soon as possible.

https://developers.strava.com/docs/oauth-updates/

OAuth2の勉強がてら、REST形式のAPIを使って「自分のアクティビティデータ」を閲覧するところまでやってみた。

■目標
1.自分のアスリートデータ(≒プロフィール情報)を取得
2.自分のアクティビティデータを取得

■前提
1.OAuth2とは
OAuth 2.0 の仕組みと認証方法 | murashun.jp
OAuth 2.0 全フローの図解と動画 - Qiita

2.Strava側のAPI利用設定(必須)
https://www.strava.com/settings/api
f:id:hhhhhskw:20181106124019j:plain

●現在の認証回り設定(参考)
f:id:hhhhhskw:20181106011843j:plain
f:id:hhhhhskw:20181106012350j:plain

■仕様
http://developers.strava.com/docs/authentication/

■使用するもの
・ブラウザ
curl (※Windows10ではデフォルトで使えたのでびっくりした)

■実際にやってみた
1.OAuth2認証開始
下記URLをブラウザより実行する。

https://www.strava.com/oauth/authorize?client_id=[[自分のクライアントID]]&response_type=code&redirect_uri=http://localhost.com/&approval_prompt=auto&scope=activity:read_all

各属性の説明は下記参照。上記例のscope属性では「activity:read_all」としている。
https://developers.strava.com/docs/oauth-updates/

2.Stravaにログインしていない場合はログインしたうえで、事前に設定したアプリケーションに対して認証を求められるので、「許可する」。
f:id:hhhhhskw:20181106011730j:plain

3.許可すると、白紙のページ(http://localhost.com)にリダイレクトされる。レスポンスURLのパラメータより、認可コード(code=aabef407793b0f2e3167c741fd1034a94c0057fd)を取得する。

http://localhost.com?state=&code=aabef407793b0f2e3167c741fd1034a94c0057fd&scope=read,activity:read_all

4.3.の認可コードを使用し、認可サーバにアクセストークンを発行してもらう。

curl -L -X POST https://www.strava.com/oauth/token?client_id=[[自分のクライアントID]]-d client_secret=[[自分のクライアントシート]] -d code=aabef407793b0f2e3167c741fd1034a94c0057fd -d grant_type=authorization_code

各属性の説明は下記参照。grant_type属性は「authorization_code」。
https://developers.strava.com/docs/oauth-updates/

レスポンス例(JSON)は下記。ここでアクセストークンを取得できる。

{"token_type":"Bearer","expires_at":1541367065,"refresh_token":"1c1ae1800520120854ab133249290465f0808e6b","access_token":"73ae3af1e62a1b8e7409f5095a830badfc7f6136","athlete":{"id":[[自分のID]],"username":"[[名前]]","resource_state":2,"firstname":"[[名]]","lastname":"[[]]" (※中略)}}

5.アクセストークン("access_token":"73ae3af1e62a1b8e7409f5095a830badfc7f6136")を使って、まずはアスリートデータを取得する。

curl -L https://www.strava.com/api/v3/athletes/[[自分のアスリートID]]?access_token=73ae3af1e62a1b8e7409f5095a830badfc7f6136

自分のアスリートIDは「Myプロフィール」ページのURL末尾の数値を参照。

実行結果は下記の通り。

{"id":[[自分のアスリートID]],"username":"[[氏名]]","resource_state":2,"firstname":"[[名]]","lastname":"[[]]" (※中略)}

6.次にアクティビティデータを取得する。取得したいアクティビティのIDは各ページのURL末尾の数値を参照。

curl -L https://www.strava.com/api/v3/activities/[[アクティビティID]]-H "Authorization: Bearer 73ae3af1e62a1b8e7409f5095a830badfc7f6136"

OAuth2のアクセストークンの渡し方は上記の通り「HTTPヘッダ」でも可。推奨は「リクエストパラメータ」だった気がする。
実行すると走行実績やGPS情報などが詰まったJSONデータが返却される。中身を確認するとアクティビティ名や走行距離、経過時間etcが記述されている。JSONのサイズは100KB程度だった。

{"resource_state":3,"athlete":{"id":[[自分のアスリートID]],"resource_state":1},"name":"BRM923富士いち200","distance":199395.0,"moving_time":32319,"elapsed_time":37836,"total_elevation_gain":1912.0,"type":"Ride","workout_type":10,"id":1859941481,"external_id":"garmin_push_3036271068","upload_id":1992936743,"start_date":"2018-09-22T22:28:25Z","start_date_local":"2018-09-23T07:28:25Z","timezone":"(GMT+09:00) Asia/Tokyo","utc_offset":32400.0,"start_latlng":[35.05,138.91],"end_latlng":[35.05,138.91],"location_city":null,"location_state":null,"location_country":"","start_latitude":35.05,"start_longitude":138.91,"achievement_count":7,"kudos_count":0,"comment_count":0,"athlete_count":1,"photo_count":0,"map"{"id":"a1859941481","polyline":"ib|tEqbynYVXEJEBc@CyDoAUOSUWw@GgFMeAJwAPo@UwA?Kx@mIt@aE^eCj@oE]g@iCoAe@uAsAuOo@{Gs@eCmCoGcAsBo@q@mDwCkAkB]iAc@cC[gCa@cCe@eCM_@iAmBwFeIeAeBm@wBg@kCe@_GOmAk@KoBP}GxAgIxAqBR[@eA_Bk@sGq@{GQeCHqCMmA_@k@s@AeBVoBt@kBb@mBXqBFuBCaFYwAJqA~@_@z@sC`Iq@bCGd@n@vFKvCSfA@x@X~DLrCDpCAlCInCQrCWpCy@nGmAhGOb@[n@}EvHgAlB (※中略)

***

7.トークンの有効期限が切れた場合は認可サーバに再度アクセストークンの発行を依頼する。この時最初に発行された「リフレッシュトークン」を提示する。grant_typeは「refresh_token」。

curl -L -X POST https://www.strava.com/oauth/token?client_id=[[自分のアスリートID]]-d client_secret=[[自分のクライアントシート]] -d code=aabef407793b0f2e3167c741fd1034a94c0057
fd -d grant_type=refresh_token -d refresh_token=1c1ae1800520120854ab133249290465f0808e6b

返却値からアクセストークンを再度取得する。

{"token_type":"Bearer","access_token":"edf4dd1136f5dc2b655d275da1ccc87f735a7e9e","expires_at":1541513430,"refresh_token":"1c1ae1800520120854ab133249290465f0808e6b"}


・その他使い方は公式ドキュメントを参照。
Strava Developers


■感想
・OAuth2認証プロセス自体は割と直感的で、Stravaから提供されているドキュメントも必要十分だと感じた。
・走行積算距離の計算など、目的別APIみたいな感じでも提供してほしいなーと思った。(まだ調べられてないだけかもですが)
・次はSDKを触ってみる。

■参考
Get a Strava API access token with write permission | Yi Zeng’s Blog
Getting Started With The Strava API: A Tutorial – Tilde Ann Thurium – Medium
↑2つ目の認可方法は以前のものなのでNG