0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OAuth認証とトークン保管による Google API のセキュアアクセス

Posted at

本記事は元々 blog.logto.io に掲載されたものです。

今日のつながったデジタル環境では、サードパーティサービスと簡単に統合できるアプリケーションが抜群のユーザー体験をもたらします。生産性スイート、AIエージェント、ドキュメント協業プラットフォームなどを構築する場合でも、Google、GitHub、Facebook など各種サービスの API を安全に活用・アクセスできることが、アプリの価値を飛躍的に高めます。

今回は、Logto の Secret Vault とソーシャルコネクター機能を使って、Google API と連携するスマートな生産性アプリを開発する方法をご紹介します。セキュアなトークン保管、AIアクセスのためのアクセス取得、増分的オーソライゼーション、そしてサードパーティサービスとのシームレス統合を実装してみましょう。

課題:スマートカレンダーアシスタントの開発

例えば "スマートカレンダーアシスタント" というアプリを開発する場面を想像してください。このアプリで実現したいことは:

  1. 基本認証:Googleアカウントでサインインしてアプリを利用できる
  2. プロフィール管理:ユーザーの基本プロフィール情報を表示
  3. カレンダー連携:カレンダーイベントを読み取り、スケジュール洞察を提供
  4. 高度な機能:ユーザーが明示的に依頼した時のみ、カレンダーイベント作成、Gmail で会議招待送信、Google Drive ドキュメント管理などプレミアム機能を提供

課題は? 必要に応じて異なるレベルの Google API アクセス権が必要であり、トークンは継続的なAPI操作のために安全に保管しつつ、しょっちゅう再認証を求めないようにすることです。

解決策:Secret VaultによるLogtoの増分的オーソライゼーション

Logto では、以下の方法でこの課題をスマートに解決します:

  • 必要最小権限の初回スコープ:サインイン時に本当に必要な権限だけをリクエスト
  • 増分的オーソライゼーション:プレミアム機能が必要な時だけ追加スコープを都度取得
  • 安全なトークンストレージ:アクセス/リフレッシュトークンを暗号化された Secret Vault へ保管・管理
  • 自動トークンリフレッシュ:トークン期限切れ時、透過的に再取得処理

それでは実装方法を順に見ていきましょう。

ステップ 1:Googleコネクターと基本スコープの設定

まず、Logto コンソールで Google コネクターを作成し、最初のセットアップで基本認証用の最小スコープを設定します:

https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
https://www.googleapis.com/auth/calendar.readonly
openid

必要なスコープは Google API ライブラリOAuth 2.0 スコープのドキュメント で調べることができます。

主な設定手順:

  1. Google Cloud Console で Google OAuth クライアントを作成し、必要なスコープを確認します
  2. Logto Google コネクター にクライアント情報を登録し、上記の最小スコープを「Scopes」フィールドへ追加
  3. コネクター設定で 「API への永続的アクセスのためにトークン保存」を有効化
  4. 「Prompts」に consent を含め、オフラインアクセス(refresh token 発行) を有効化

Logtoドキュメントの Google コネクター設定ガイド も参考にしてください。

この設定により、ユーザーはサインインでき、アプリはカレンダーイベントの読み取り権限が得られます。基本のスケジュール洞察を提供するには十分です。

ステップ 2:サインインフローの実装

Logto > サインイン体験 > サインアップとサインイン へ進み、「ソーシャルサインイン」欄で Google コネクターを追加すれば、ユーザーは Google で認証できます。

ユーザーが Google でサインインすると Logto は自動的に:

  • 設定済みのスコープでユーザー認証
  • アクセス/リフレッシュトークンを Secret Vault に安全に保管
  • ユーザープロフィール情報をあなたのアプリへ返却
// Google サインイン成功後、アプリが受け取るセッション
const userSession = await logtoClient.getIdTokenClaims();
console.log(`ようこそ ${userSession.name} さん!`);

これでトークンはユーザーの Google ID に紐付き、安全にAPIコールで利用できます。

ステップ 3:保管済みトークンで Google API へアクセス

ユーザーのカレンダーイベントを読み取るには、保管されたアクセストークンを取得し、Google Calendar API を呼び出します:

// 保存された Google アクセストークンを取得
const tokenResponse = await fetch('/my-account/identities/google/access-token', {
  headers: {
    Authorization: `Bearer ${userAccessToken}`, // Logtoのアクセストークン
  },
});

const { accessToken } = await tokenResponse.json();

// Google Calendar API を呼び出す
const calendarResponse = await fetch(
  'https://www.googleapis.com/calendar/v3/calendars/primary/events',
  {
    headers: {
      Authorization: `Bearer ${accessToken}`,
    },
  }
);

const events = await calendarResponse.json();

トークンの期限切れ時でも Logto が自動でリフレッシュ処理を行うため、リフレッシュトークンがあれば新しいアクセストークンを透過的に取得できます。

ステップ 4:プレミアム機能向けの増分オーソライゼーション

ユーザーがカレンダー作成や Gmail 連携などプレミアム機能を使いたい場合、Logto の Social Verification API で追加スコープをリクエストしましょう:

// プレミアム機能利用時に追加スコープを要求
const verificationResponse = await fetch('/api/verification/social', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${userAccessToken}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    connectorId: 'google-connector-id',
    redirectUri: 'https://yourapp.com/callback',
    scope: 'https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/gmail.send',
  }),
});

const { verificationRecordId, authorizationUri } = await verificationResponse.json();

// ユーザーを Google の追加認証画面へリダイレクト
window.location.href = authorizationUri;

追加の許可がユーザーから与えられたら、検証を完了しトークン保管セットを更新:

// コールバックで認可内容を検証
await fetch('/api/verification/social/verify', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${userAccessToken}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    verificationRecordId,
    connectorData: {
      /* コールバックから取得した認可コード */
    },
  }),
});

// 新しいスコープを反映したトークンセットに更新
await fetch('/my-account/identities/google/access-token', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${userAccessToken}`,
  },
  body: JSON.stringify({
    socialVerificationId: verificationRecordId,
  }),
});

これで新しいスコープを含むトークンで、カレンダー作成やメール送信が実現できます。

ステップ 5:トークンの状態を管理

Logto コンソールではトークン管理機能も充実。 ユーザー管理 > 対象ユーザー選択 > ソーシャル接続 で:

  • トークン状態:有効/期限切れ/無効/該当なし
  • トークンメタデータ:作成日時、最終更新、期限、付与スコープ
  • 接続管理:Googleから同期したプロフィール情報の閲覧

これにより、管理者もユーザー連携状況やトークン関連のトラブルを把握できます。

Googleだけでなく多彩なサードパーティ連携を実現

スマートカレンダーアシスタントは、Google以外の様々なサービスとも連携可能です。人気のソーシャルコネクターとしては、Google(認証・カレンダー・Gmail 連携)、GitHub(コードリポジトリ、イシュー管理)、Facebook(ソーシャル機能、マーケティング分析)等が利用できます。今後、トークン保存対応のプリビルトコネクターも続々追加予定です。

カスタム連携なら、標準の OIDC または OAuth 2.0 接続でも柔軟に拡張可能です。この包括的なエコシステムで、ほぼ全てのサードパーティサービスと連携できます。

セキュリティ & ベストプラクティス

Logto の Secret Vault はエンタープライズ級のセキュリティを採用:

  • シークレットごとの暗号化:トークン毎にユニークなデータ暗号鍵(DEK)で保護
  • 鍵ラッピング方式:DEK を鍵暗号鍵(KEK)で暗号化
  • 極小限の露出:APIコール時のみトークンを復号
  • 自動クリーンアップ:アカウント切断やコネクター削除時にトークン自動削除

まとめ

Logto はセキュアかつ開発者にやさしい認証基盤であり、サードパーティサービス連携を包括的にサポートします。

Logto の増分オーソライゼーションと安全なトークン保管により、スマートカレンダーアシスタントは機能性とセキュリティを両立したシームレスなUXを実現します。コア機能では最小限の許可のみを SSO で取得し、ユーザーが進んで高機能を使う時だけ自然かつ文脈的な許可リクエストを提示。オンボーディングはスムーズでストレスなしです。

安全に保管されたトークンによる永続 API アクセスで、ユーザーは再認証の煩わしさなく業務を継続――プロフェッショナルな体験を生み出します。この仕組みは設計段階からセキュリティを重視しており、エンタープライズレベルの暗号化でユーザー認証情報をしっかり守ります。

さあ、サードパーティAPI統合にトライしましょう!

  1. LogtoをセットアップLogtoテナントを作成し、最初のソーシャルコネクターを設定
  2. トークン保存を有効化:コネクター設定で「API 永続アクセス用トークン保存」をONに
  3. 増分認証を実装:必要に応じて Social Verification API で追加スコープ要求
  4. 拡張・スケール:Logto のコネクター拡張エコシステムで他サービス連携も容易

アプリ開発の未来はサービスのシームレス統合にあります。Logto の Secret Vault とコネクターを活用すれば、あなたのアプリはユーザーの日常を支える”つながる体験”を実現できます。

もっと知りたい場合は インテグレーションガイド をチェックして、今すぐ次の連携アプリ開発を始めましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?