ブログ
Microsoft Graph APIを使ってLaravelからメールを送る方法②
こんにちは!
前回の記事では、LaravelからMicrosoft OAuth認証を行い、Microsoft Graph APIを使ってHTMLメールを送信する方法を紹介しました。
その中で最後に触れた通り、実運用ではアクセストークンの有効期限切れに対応する必要があります。
今回は続編として、リフレッシュトークンを使ったトークン更新処理を実装していきます。
なぜリフレッシュトークンが必要なのか
Microsoft Graph APIで取得できるアクセストークンは、有効期限が1時間と非常に短いです。
つまり、「認証できた」「メールが送れた」だけでは本番運用には不十分です。
そこで必要になるのがリフレッシュトークンです。
Microsoft OAuthのトークン構成
Microsoft OAuth認証後に取得できる主な値は以下です。
| 項目 | 説明 |
| access_token | API呼び出しに使用 |
| refresh_token | アクセストークン更新用 |
| expires_in | 有効期限(秒) |
| scope | 許可されたスコープ |
リフレッシュトークンを使った更新処理
トークン更新用メソッドを作成します。
前回記事と同様、受け取ったアクセストークンなどの情報はキャッシュに保存しています。
public function refreshAccessToken(): void
{
$refreshToken = Cache::get('ms_refresh_token');
if (!$refreshToken) {
throw new \Exception('リフレッシュトークンが見つかりません。');
}
$response = Http::asForm()->post(
'https://login.microsoftonline.com/' .
env('MICROSOFT_TENANT_ID') .
'/oauth2/v2.0/token',
[
'client_id' => env('MICROSOFT_CLIENT_ID'),
'client_secret' => env('MICROSOFT_CLIENT_SECRET'),
'grant_type' => 'refresh_token',
'refresh_token' => $refreshToken,
'scope' => 'https://graph.microsoft.com/.default',
]
);
if ($response->failed()) {
throw new \Exception('アクセストークンの更新に失敗しました。');
}
$data = $response->json();
Cache::put(
'ms_access_token',
$data['access_token'],
now()->addSeconds($data['expires_in'] - 60)
);
Cache::put('ms_refresh_token', $data['refresh_token']);
}次に、以前作成したメール送信処理にトークン更新ロジックを組み込みます。
public function sendMail(): void
{
$accessToken = Cache::get('ms_access_token');
try {
Http::withToken($accessToken)
->post('https://graph.microsoft.com/v1.0/me/sendMail', [
'message' => [
'subject' => 'HTMLメールの件名',
'body' => [
'contentType' => 'HTML',
'content' => '<p>こんにちは!</p>',
],
'toRecipients' => [
[
'emailAddress' => [
'address' => 'example@example.com'
]
],
],
],
'saveToSentItems' => true,
])
->throw();
} catch (RequestException $e) {
// アクセストークンの有効期限が切れていた場合更新を行う。
if (!$retried && $e->response && $e->response->status() === 401) {
app(MicrosoftTokenService::class)->refreshAccessToken();
// メール再送
$this->sendMail(true);
return;
}
throw $e;
}
}これで、メール送信処理でアクセストークンの有効期限切れが発生した際に、自動でアクセストークンの更新処理を行えるようになりました。
※ リフレッシュトークンが失効した場合は、再度認証が必要となります。
まとめ
今回は、Laravel × Microsoft Graph APIにおいて、リフレッシュトークンを使ったアクセストークン更新処理を実装しました。
これで、アクセストークンの有効期限が切れた場合でも、自動で更新を行うため格段に使いやすくなると思います。
Microsoft Graph APIをLaravelで使う際の参考になれば幸いです。
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!