yahoo-id.sh: Yahoo APIのアクセストークンを取得する開発ツール

本稿は、Yahoo! ID連携API(v1)でYahoo APIのアクセストークンを取得するCLIツールである「yahoo-id.sh」を紹介する。

本稿で紹介するツールは、以前投稿した[Yahoo! ID連携(v1)でアクセストークンを取得する手順をHTTPだけで説明する - Qiita](https://qiita.com/suin/items/a47ab0412c46e32537bf)に基づいて、Yahoo! ID連携(v1)でアクセストークン取得の手順を自動化したシェルスクリプトである。

このツールの用途は、開発者がYahoo APIを使ったアプリケーションの開発時に、マニュアルでアクセストークンを取得したいときに用いることを想定している。

## yahoo-id.shの使い方

`yahoo-id.sh`を実行し、表示されるガイダンスに従っていくと、アクセストークンとリフレッシュトークンが取れる。

```bash
./yahoo-id.sh
```

実行例:

<img width="769" alt="Hyper.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/72bf405f-b3d2-0df4-c452-53edfd907c2f.png">

ちなみに、アプリケーションID、シークレット、コールバックURLの入力を都度したくないときは、環境変数`YAHOO_APPLICATION_ID`, `YAHOO_SECRET`, `YAHOO_CALLBACK_URL`を与えると、それらの入力をスキップできる:

```bash
YAHOO_APPLICATION_ID=aBcDeFgHiJkLmNoPqRsTuVwXyZ- \ 
YAHOO_SECRET= 1234567890abdef1234567890abdef \
YAHOO_CALLBACK_URL=https://example.com/ \
./yahoo-id.sh
```

## yahoo-id.shのソースコード

```bash:yahoo-id.sh
#!/usr/bin/env bash

set -eu

function echo:bold {
	echo -e "\033[1m$@\033[0m"
}

function echo:url {
	echo -e "\033[04m\033[36m$@\033[0m"
}

function echo:red {
	echo -e "\033[31m$@\033[0m"
}

function echo:green {
	echo -e "\033[32m$@\033[0m"
}

: 'Declare variables by environment variables' && {
	applicationId=${YAHOO_APPLICATION_ID:-}
	secret=${YAHOO_SECRET:-}
	callbackUrl=${YAHOO_CALLBACK_URL:-}
	authorizationToken=${YAHOO_AUTHORIZATION_TOKEN:-}
	accessToken=""
	refreshToken=""
}

: 'Input the application information' && {
	while [ "${applicationId}" = '' ] || [ "${secret}" = '' ] || [ "${callbackUrl}" = '' ]; do
		echo:bold 'アプリケーションの管理からアプリケーションの詳細ページを開き、当該アプリケーションの情報を入力してください。'
		echo:url '  https://e.developer.yahoo.co.jp/dashboard/'
		echo ''
		[ "${applicationId}" = '' ] && read -p 'アプリケーションID: ' applicationId
		[ "${secret}" = '' ] && read -p 'シークレット: ' secret		
		[ "${callbackUrl}" = '' ] && read -p 'コールバックURL: ' callbackUrl
		echo ''
	done
}

: 'Declare Authorization header' && {
	authorizationHeader="Basic $(echo -n "${applicationId}:${secret}" | base64)"
}

: 'Open auth page to get authorization token' && {
	nonce=1
	authUrl="https://auth.login.yahoo.co.jp/yconnect/v1/authorization?response_type=code+id_token&client_id=${applicationId}&redirect_uri=${callbackUrl}&scope=openid+profile&nonce=${nonce}"
	echo:bold '下記のURLを開いてYahoo! JAPAN IDで認証してください。'
	echo:url "  ${authUrl}"
	echo ''
}

: 'Input authorization token' && {
	while [ "${authorizationToken}" = '' ]; do
		echo:bold '認証後にリダイレクトされたURLの"code"パラメータの値を入力してください。'
		echo:url '  http://example.com/?code=********'
		echo:bold '                           ^^^^^^^^この部分'
		read -p 'code: ' authorizationToken
		echo ''
	done
}

: 'Get access token and refresh token' && {
	: 'Fetch access token and refresh token' && {
		echo:bold 'アクセストークンとリフレッシュトークンを取得します...'
		echo ''
		accessTokenFile=$(mktemp)
		curl \
			-H 'Content-Type:application/x-www-form-urlencoded' \
			-H "Authorization:${authorizationHeader}" \
			-d "grant_type=authorization_code&code=${authorizationToken}&redirect_uri=${callbackUrl}" \
			https://auth.login.yahoo.co.jp/yconnect/v1/token > $accessTokenFile
		echo ''
		echo:bold "レスポンスを ${accessTokenFile} に保存しました。"
		echo ''
	}

	: 'Parse JSON to set access token' && {
		accessToken=$(cat accessTokenFile | php -r 'print(json_decode(fgets(STDIN))->access_token ?? "");')
		[ "${accessToken}" = "" ] && {
			echo:red 'アクセストークンが取得できませんでした。レスポンスがJSONでない可能性があります。'
			exit 1
		}
	}

	: 'Parse JSON to set refresh token' && {
		refreshToken=$(cat accessTokenFile | php -r 'print(json_decode(fgets(STDIN))->refresh_token ?? "");')
		[ "${refreshToken}" = "" ] && {
			echo:red 'リフレッシュトークンが取得できませんでした。レスポンスがJSONでない可能性があります。'
			exit 1
		}
	}

	: 'Show the access token and the refresh token' && {
		echo:bold '下記のアクセストークンとリフレッシュトークンを取得しました。'
		echo ''
		echo -e "$(echo:green アクセストークン:) ${accessToken}"
		echo -e "$(echo:green リフレッシュトークン:) ${refreshToken}"
		echo ''
	}
}
```

## インストール方法

* 上のソースコードを`yahoo-id.sh`として保存する。
* `chmod +x yahoo-id.sh` する。