OAuth2の認証を使う(Misoca API)
Misoca(ミソカ)のAPIを使ってみよう!
OAuth2の認証を使っているということなのでOAuth2のことを調べてみた。
■Misoca(ミソカ)
Misocaにアカウントを登録してAPIの準備をします。
Misoca APIのドキュメント
https://doc.misoca.jp/
Misoca API v1
https://doc.misoca.jp/v1/
Misoca API v3
https://doc.misoca.jp/v3/
上記ドキュメントの「アプリケーション登録」の手順でAPIの準備をします。
・Application Id
・Secret
・Callback urls
上記の3つの値をメモします。
■OAuth2
https://github.com/thephpleague/oauth2-client
OAuth2の認証は上記ツールを使いました。
ダウンロードしたバージョンは2.4.1です。
上記バージョンだとPHP5.6、7~7.3まで対応です。
Composerで必要ツールを用意します。
1 2 3 4 |
#-- ディレクトリの移動(oauthフォルダを作ってそちらに) $ cd oauth #-- composerで必要ツールを取得 $ composer require league/oauth2-client |
プログラムコード
README.mdの中に記載のあるコードを使いましょう。
修正したものが下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
$provider = new \League\OAuth2\Client\Provider\GenericProvider([ 'clientId' => '*************************', // The client ID assigned to you by the provider 'clientSecret' => '*************************', // The client password assigned to you by the provider 'redirectUri' => 'http://********/your-redirect-url/', 'urlAuthorize' => 'https://app.misoca.jp/oauth2/authorize', 'urlAccessToken' => 'https://app.misoca.jp/oauth2/token', 'urlResourceOwnerDetails' => '', 'scopes'=>'write' ]); // If we don't have an authorization code then get one if (!isset($_GET['code'])) { // Fetch the authorization URL from the provider; this returns the // urlAuthorize option and generates and applies any necessary parameters // (e.g. state). $authorizationUrl = $provider->getAuthorizationUrl(); // Get the state generated for you and store it to the session. $_SESSION['oauth2state'] = $provider->getState(); // Redirect the user to the authorization URL. header('Location: ' . $authorizationUrl); exit; // Check given state against previously stored one to mitigate CSRF attack } elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) { if (isset($_SESSION['oauth2state'])) { unset($_SESSION['oauth2state']); } exit('Invalid state'); } else { try { // Try to get an access token using the authorization code grant. $accessToken = $provider->getAccessToken('authorization_code', [ 'code' => $_GET['code'] ]); // APIにリクエストを送信(見積もりの作成) // $mitsumoriに見積もりの配列を入れます。詳細はMisocaのドキュメントを確認 $request = $provider->getAuthenticatedRequest( 'POST', 'https://app.misoca.jp/api/v3/estimate', $accessToken, array( "body"=>json_encode($mitsumori), 'headers' => array( 'Content-Type' => 'application/json;charset=UTF-8', // このヘッダーがないと返りがうまくいかない ), ) ); // APIからのレスポンスを取得 $response = $provider->getResponse($request); // レスポンスのボディ部分を取得 $data = $response->getBody()->getContents(); // JSONで返ってきているのでデコード $result = json_decode($data, true); session_destroy();// セッションを削除 } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { // Failed to get the access token or user details. exit($e->getMessage()); } } |
●修正内容
2~7行目を修正
8行目に「scopes」を追加
41~63行目を追加・修正
リクエスト&レスポンスを追加
詳しくはMisocaのドキュメントを確認してください
OAuth2にすごい時間かかりました・・・(疲