この記事は、Stripe Apps を25日間紹介し続ける Advent Calendar 2022 16日目の記事です。
Stripe以外のAPIと連携したアプリケーションを開発する場合、API認証のためにAPIキーやOAuthのトークンが必要になります。
この記事では、Stripe AppsアプリでAPIキーやトークン情報を安全に管理するためのAPIについて、紹介します。
StripeのSecret Store API
Stripeには、アプリごとにAPIキーなどの秘密情報を保存・管理するためのAPIが用意されています。
await stripe.apps.secrets.create({
scope: {
type: 'account'
},
name: 'example_secret',
payload: "secret text"
})
payload
に指定した値を、Stripeアカウントまたはアカウントに紐づくユーザー単位で保存できます。
Secret Store APIで、個人情報やクレジットカード情報などを保存することは禁止されています。
Stripe CLIでSecret Store APIへのアクセス権を設定する
Secret Store APIへのアクセスも、CLIで権限設定が必要です。
$ stripe apps grant permission "secret_write" "Allows storing secrets between page reloads"
Secret Store APIの「アカウント単位」と「ユーザー単位」
APIキーやOAuthトークンは、サービスによって単位が異なります。
アカウントごとにAPIキーやトークンを発行できるサービスもあれば、ユーザー単位で認証を行う必要があるサービスも存在します。
そのため、StripeのSecret Store APIを利用する場合、どの粒度でデータを保存するかを決めることができます。
アカウント単位で利用するデータの場合、scope.type: 'account'
で保存します。
await stripe.apps.secrets.create({
scope: {
type: 'account'
},
name: 'example_secret',
payload: "secret text"
})
もしユーザーごとに利用するトークンやAPIキーが異なるサービスの場合は、scope.type
をuser
に変更します。
この場合、src/views
に配置したコンポーネントが取得できるユーザーIDを渡す必要があります。
const App = ({ userContext }: ExtensionContextValue) => {
const userId = userContext.id
const handleSave = useCallback(async () => {
await stripe.apps.secrets.create({
scope: {
type: "user",
user: userId
},
name: 'example_secret',
payload: "secret text"
})
}, [userId])
保存できるデータ数量の制限
account
のデータは、1アカウントあたり10個まで保存できます。
同様に、user
のデータは、1ユーザーあたり10個まで保存することができます。
詳細は、以下の記事をご確認ください。
保存したデータを取得・削除する方法
取得したデータの表示や削除には、「保存時に設定したスコープ」と「キーの名前」が最低限必要です。
const { payload } = await stripe.apps.secrets.find({
scope: { type: 'user', user: userContext.id },
name: 'secret_name',
expand: ['payload'],
})
expand: ['payload']
で明示的にデータを取得しない場合、メタ情報のみ表示される点にご注意ください。
フロントエンドで保存したデータを、サーバー側で取得する
Secret Store APIを利用するもう1つのメリットは、「Stripeを介して、フロントエンドとサーバーが同じデータにアクセスできる」ことです。
フロントエンドのReactアプリで、APIキーなどの情報を保存します。
await stripe.apps.secrets.create({
scope: {
type: "account"
},
name: "example_api_key",
payload: "api_test_xxxx"
})
その後、「同じStripeアカウントを参照する、サーバー側のプログラム」が、このAPIキーをStripe API経由で取得します。
const { payload } = await stripe.apps.secrets.find({
scope: { type: "account" },
name: "example_api_key",
expand: ["payload"],
})
この方法であれば、APIキーの情報を安全に受け渡しすることができます。
バッチ処理やWebhookなどで連携するサービスのアクセス情報を取り扱う際には、このSecret Store APIをご利用ください。
Documents
Stripe Appsひとりアドベントカレンダー 2022
今年ベータリリースされたばかりのStripe Appsは、まだ日本語の情報が多くありません。
そこでQiita Advent Calendar 2022にて、毎日Stripe Appsについての情報を投稿します。
ノーコードで利用する方法や、開発するためのTipsなども紹介予定ですので、ぜひ購読をお願いします。