メインコンテンツまでスキップ
プレビュー版
PocketSign Link v2 は現在プレビュー版です。正式提供までに仕様が変更される可能性があります。

エラーリファレンス

PocketSign Link v2 のエラーは、返り方が場面ごとに異なります。 このページでは、エラーの全体像と横断的なハンドリング指針をまとめます。 各 API 固有のエラーコードは、それぞれの API ページを参照してください。

エラーの見え方

場面返り方詳細ページ
authorize のフロントチャネルredirect_uri へのクエリパラメータ、または画面遷移失敗認可リクエスト
parサーバー間のエラーレスポンス認可リクエスト
tokenサーバー間のエラーレスポンストークン
userinfo / introspect / revokeサーバー間のエラーレスポンスUserInfo・Introspection
IdP ConnectRPC APIConnectRPC detail の error reasonIdPUserService API / IdPClientService API
Registry 読み取り系result.error フィールドRegistryUserService API / RegistryClientService API
Registry 書き込み系ConnectRPC detail の error reasonRegistryUserService API / RegistryClientService API

OIDC エラーのハンドリング指針

  • prompt=none 系のエラー(login_requiredinteraction_requiredconsent_required)は、そのまま失敗画面にせず、ユーザー操作が必要なことを RP で扱う
  • invalid_client は運用設定や秘密情報の問題として扱う
  • invalid_grant は再ログインや再認可に戻す判断材料にする

userinfo / introspect / revoke での注意

userinfo

  • Bearer トークンなら Authorization: Bearer
  • DPoP トークンなら Authorization: DPoPDPoP proof が必要

introspect / revoke

  • クライアント認証が必要
  • トークン自体が無効でも、revoke は RFC 7009 に従い 200 OK を返すことがある

ConnectRPC の detail error

PocketSign Link v2 の ConnectRPC API では、標準の Connect エラーコード(NOT_FOUNDPERMISSION_DENIED など)に加えて、エラーの原因を特定するための detail error を返します。

detail error は ConnectRPC の error details として、google.rpc.ErrorInforeason フィールドに格納されます。

レスポンス形式

{
"code": "not_found",
"message": "subscription not found",
"details": [
{
"type": "google.rpc.ErrorInfo",
"value": {
"reason": "REGISTRY_USER_SERVICE_ERROR_CODE_SUBSCRIPTION_NOT_FOUND"
}
}
]
}
フィールド説明
codeConnect の標準エラーコード(not_foundpermission_deniedinvalid_argumentfailed_precondition など)
messageエラーの概要メッセージ
details[].value.reasonPocketSign Link v2 固有のエラーコード。エラーの原因を一意に特定できる

RP 側でエラーハンドリングを実装する際は、code だけでなく reason を使って分岐することで、より適切なエラー処理が可能になります。

reason で分岐する

同じ Connect code でも reason が異なる場合があります。たとえば permission_denied は「権限なし」「一時停止」「期限切れ」の 3 通りがあり、それぞれ RP 側で異なる対応が必要です。

reason対応の例
*_PERMISSION_DENIED権限要求の導線を提示する
*_PERMISSION_SUSPENDEDユーザーに権限の再有効化を案内する
*_PERMISSION_EXPIRED再認可を促す
*_SUBSCRIPTION_NOT_FOUNDサブスクリプションの存在を確認する
*_RESOURCE_DEFINITION_NOT_FOUNDリソース ID またはエイリアスの指定を確認する
*_JSON_SCHEMA_VALIDATION_FAILED書き込む値をリソース定義の JSON Schema に合わせる
*_INVALID_VALUE_FORMATリソースの値形式(文字列 / JSON / バイナリ)を確認する

その他の reasonについては、API ドキュメント を参照してください。

details の取得方法

ConnectRPC クライアントライブラリを使っている場合、エラーレスポンスの details から google.rpc.ErrorInfo を取得して reason を参照します。

import (
"errors"

"connectrpc.com/connect"
"google.golang.org/genproto/googleapis/rpc/errdetails"
)

_, err := client.WriteResourceValue(ctx, req)
if err != nil {
var connectErr *connect.Error
if errors.As(err, &connectErr) {
for _, detail := range connectErr.Details() {
value, unwrapErr := detail.Value()
if unwrapErr != nil {
continue
}
if errorInfo, ok := value.(*errdetails.ErrorInfo); ok {
switch errorInfo.GetReason() {
case "REGISTRY_USER_SERVICE_ERROR_CODE_PERMISSION_DENIED":
// 権限要求の導線を表示
case "REGISTRY_USER_SERVICE_ERROR_CODE_PERMISSION_SUSPENDED":
// ユーザーに権限の再有効化を案内
case "REGISTRY_USER_SERVICE_ERROR_CODE_PERMISSION_EXPIRED":
// 再認可を促す
case "REGISTRY_USER_SERVICE_ERROR_CODE_JSON_SCHEMA_VALIDATION_FAILED":
// 書き込む値を修正
default:
// その他のエラー
}
}
}
}
}

関連ページ