Zendesk Developer Platform上に構築した場合、401または403エラーが発生する可能性があります。これらのステータスコードは、特にインテグレーションのライフサイクルの初期に見られる、開発者からのAPIリクエストの失敗の原因となっています。
どちらのエラーもアクセス制御に関連していますが、失敗の理由は異なり、必要なアプローチも異なります。これらを交換可能なものとして扱うと、時間を無駄にし、リクエストが繰り返し失敗してしまうことがあります。
この記事では、401エラーと403エラーがZendeskでどのように機能するか、迅速に診断する方法、そして自信を持って解決する方法について、実例とトラブルシューティングのステップを通して学習します。
学習内容
この記事をお読みいただくと、次のことがわかります。
- Zendeskの401 Unauthorizedと403 Forbiddenの違い
- How to authenticate correctly with API tokens, OAuth access tokens, and JWTs(APIトークン、OAuthアクセストークン、JWTを使用した正しい認証方法)
- OAuthが認証に与える影響
- How to Diagnostics of the Malformed Headers, incorrect subdomains, and expired credentials(不正なヘッダー、不正なサブドメイン、期限切れの資格情報の診断方法)
401と403の違い
どちらのステータスコードもアクセス制御に関連していますが、リクエストプロセスのさまざまな段階で失敗します。
401 権限がありません
401応答は、Zendesk APIがリクエストを認証できないことを意味します。Zendeskは発信者を特定できないため、権限やビジネスロジックは評価されません。
一般的な原因は次のとおりです。
- Authorizationヘッダーがない、または形式が正しくない
- 基本認証のBase64エンコーディングが正しくない
- メールとトークンの形式が正しくありません
- 期限切れまたは取り消されたAPIトークン
- Basic認証ヘッダー内のOAuth
- メッセージングのJWTが無効または期限切れです
401エラーが表示された場合は、リクエストが何をしようとしているかではなく、リクエストの認証方法に注目してください。
403 Forbidden
403応答は、Zendeskがリクエストを認証したが、認証されたIDに要求されたアクションを実行する権限がないことを意味します。
一般的な原因は次のとおりです。
- 必要なスコープのないOAuthトークン
- エージェント専用エンドポイントに対するエンドユーザーの資格情報
- 別のブランドに属するリソースへのアクセス
- アカウントのIP許可リストルール
- 一時停止またはダウングレードされたエージェントアカウント
403エラーが表示された場合、認証は成功します。問題は認証です。
クイック診断フロー
アクセスに関する問題をデバッグする場合、最も迅速な方法は、問題を段階的に切り分けることです。
- カールテストから始めましょう。curlリクエストが失敗した場合、問題はアプリケーションコードではなく、資格情報またはアカウント設定に関連している可能性があります
- 正しいZendeskサブドメインを呼び出していることを確認します。資格情報は特定の環境を対象とし、サンドボックスと本番トークンは交換されません。
- 正しい認証方法を使用していることを確認してください。Basic Auth、OAuth、および JWT を混在させると、多くの場合に失敗します。
- 認証済みユーザーのロールを確認してください。多くのエンドポイントでは、認証に成功してもエージェントまたは管理者の権限が必要
- OAuthを使用する場合は、エンドポイントに必要なスコープがトークンに含まれていることを確認します。
- 最後に、リクエストの実行場所を検討します。APIトークンのBasic認証やその他のサポートされていないクライアント側フローを使用すると、Cross-Origin Resource Sharing(CORS)ポリシーが原因で、ブラウザからのリクエストが失敗することがよくあります。ブラウザからAPIを呼び出す必要がある場合は、CORSをサポートするOAuthを使用するか、バックエンドサービスを介してリクエストをルーティングするか、ZAFクライアントでZendeskアプリを使用します。CORSリクエストの詳細については、「Making client-side CORS requests to the Ticketing API(チケットAPIへのクライアント側CORSリクエストの作成)」を参照してください。
正しく認証
認証は、権限またはビジネスロジックのチェックの前に実行されます。認証に失敗した場合、Zendeskはリクエストをユーザーまたはインテグレーションに関連付けることができず、401エラーを返します。
Zendeskは、厳格なフォーマットルールを持つ複数の認証方法をサポートしています。
APIトークン認証
APIトークンは基本認証を使用し、ユーザー名には/tokenサフィックスを含める必要があります。
正しい形式は次のとおりです。
curl -v \ -u "agent@example.com/token:YOUR_API_TOKEN" \ "https://yoursubdomain.zendesk.com/api/v2/tickets.json"
401エラーを返すよくある間違いは、/tokenサフィックスの省略です。
emailAddress:APITOKEN
Node.jsの例:
import fetch from "node-fetch";
import btoa from "btoa";
const subdomain = "your_subdomain";
const email = "agent@example.com";
const token = process.env.API_TOKEN;
const response = await fetch(
`https://${subdomain}.zendesk.com/api/v2/users/me.json`,
{
headers: {
'Authorization': 'Basic ' + btoa(`${email}/token:${token}`),
'Content-Type': 'application/json'
}
}
);
console.log(response.status, await response.text());
OAuth 認証
存続期間の長い認証情報や詳細な権限管理が必要なインテグレーションでは、多くの場合OAuthが使用されます。ベアラー方式でOAuthアクセストークンを送信します。次のヘッダーを使用します。
Authorization: Bearer ACCESS_TOKEN
curlを使用したリクエストの例:
curl \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ "https://yoursubdomain.zendesk.com/api/v2/users/me.json"
Node.jsの例:
import fetch from "node-fetch";
const subdomain = process.env.SUBDOMAIN;
const token = process.env.OAUTH_TOKEN;
const url = `https://${subdomain}.zendesk.com/api/v2/users/me.json`;
const response = await fetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${token}`
}
});
console.log(response.status, await response.text());
OAuthで401 Unauthorizedが発生する一般的な原因は、有効なアクセストークンが誤ったスキームで送信されたことです。この場合、Zendeskはリクエストを認証できず、スコープまたは権限を評価する前に401を返します。
OAuthトークンは、許可するアクションを定義するスコープも使用します。トークンは認証されますが、エンドポイントに必要なスコープがない場合、403 Forbiddenが返されます。
たとえば、tickets:readのトークンはチケットデータを取得できますが、チケットを作成または更新することはできません。適切なスコープなしで書き込みを試みると、常に403エラーが返されます。
403: You do not have access to this resource
この場合、認証は機能しますが、正しいスコープでトークンを再生成する必要があります。スコープの詳細については、「OAuth Tokens for Grant Types」を参照してください。
メッセージングのJWT認証
WebアプリやモバイルアプリでのZendeskメッセージングは、JWTを使用してエンドユーザーを特定します。バックエンドは、管理センターのシークレットを使用してJSON Webトークンに署名する必要があります。Zendeskは、メッセージングセッションをユーザーに関連付ける前にトークンを検証します。
メッセージングJWTには、Zendeskがユーザーの身元を解決できるように、特定のヘッダーとクレーム値が必要です。
メッセージングJWTには、少なくとも次のものが含まれている必要があります。
- kid:ペイロードではなく、JWT ヘッダーの管理センターからのキー ID
- external_id:ユーザーの一意のID
- scope – メッセージングのエンドユーザー認証の値「user」
name、email、email_verifiedなどのオプションのクレームは、エージェントインターフェイスとSupportのメールベースのID照合にユーザーの詳細情報を入力できます。
Node.js JWTジェネレータの例:
import jwt from "jsonwebtoken";
const payload = {
scope: "user",
external_id: "user_12345",
name: "Jane Doe",
exp: Math.floor(Date.now() / 1000) + (5 * 60)
};
const token = jwt.sign(payload, process.env.ZENDESK_JWT_SECRET, {
keyid: process.env.ZENDESK_KEYID,
});
console.log(token);
external_idやscopeなどの必須クレームがない場合、または間違ったシークレットでサインインした場合、Zendeskは401 Unauthorizedを返します。
JWTでよくある401の原因:
- 間違った環境からのJWTシークレット(サンドボックスと本番環境)
- トークンの有効期限が切れているか、時間ベースの請求が無効です
- external_idやscopeなどの必要なクレームがありません
- 不正なシークレットまたはローテーションされたシークレットで署名されたトークン
- 不正な形式または不適切にエンコードされたJWT
メッセージング認証をデバッグするには、まず正しいシークレットと必要なクレームを確認します。認証は成功したが、IDの動作がオフであると思われる場合は、external_idおよびオプションのIDフィールドの安定した一貫した値をセッション全体で確認します。詳細については、「Authenticating users in your application(アプリケーションでのユーザーの認証)」を参照してください。
401エラーの一般的な原因
401応答は、Zendeskがリクエストを認証できず、発信者の身元を確認できないことを意味します。
Authorizationヘッダーの誤り、トークンの無効化、環境の不一致などが原因で、401応答のほとんどが返されます。
Basic認証ヘッダーを次のようにフォーマットします。
headers: {
'Authorization': 'Basic ' + btoa(`${email}/token:${token}`),
'Content-Type': 'application/json'
}
予期しない文字、空白、エンコーディングの問題により、サイレントエラーが発生することがよくあります。
Zendesk REST APIはブラウザ起点の認証をSupportしていません。CORS、セッションcookieの欠落、サポートされていない認証フローが原因で、クライアント側のJavaScriptリクエストが失敗します。代わりにバックエンドサービスまたはZAFクライアントを使用するZendeskアプリを使用してください。
403エラーの一般的な原因
403応答は、Zendeskがリクエストを認証したが、権限ルールがアクセスを拒否したことを示します。
OAuthの欠如は、ほとんどの403応答の原因となります。たとえば、tickets:readのトークンは、チケットの取得はできますが、作成や更新はできません。書き込みを試みると、必ず403エラーが返されます。
トークン作成後にOAuthコープを変更することはできません。スコープが間違っていた場合は、新しいトークンを生成します。
もう1つのよくある落とし穴は、エンドユーザーの資格情報を使用してエージェント専用のエンドポイントにコールすることです。エンドユーザーのOAuthトークンは/users/meを呼び出すことができますが、チケット、ビュー、チケットフィールドなどの制限付きエンドポイントの場合は403を返します。
その他の原因としては、トークンの無効化、IP許可リストのルール、複数ブランドのアクセス制限などがあります。このような場合、資格情報が非アクティブであるか、ユーザーがアクセス基準を満たしていないため、Zendeskはリクエストを拒否します。
段階的なトラブルシューティング
1.資格情報を個別に検証:
curl -v \ -u "email/token:token" \ "https://yoursubdomain.zendesk.com/api/v2/users/me.json"
- これに失敗した場合:この問題には、資格情報またはアカウントが関係している可能性があります。
- 成功した場合:資格情報は有効です。問題は、アプリケーションのロジックまたは環境にあります。手順2に進みます。
2.CORS制限を確認:
curlは機能しても、クライアント側アプリが失敗する場合は、CORSの制限に抵触する可能性があります。ブラウザの開発者コンソールを開き、エラーを確認します。401/403にAccess-Control-Allow-Originメッセージが表示された場合、ブラウザはZendeskがリクエストを処理する前にリクエストをブロックします。
3.未加工のリクエストヘッダーを調べる:
- Authorizationヘッダーを記録します。アプリが送信する文字列をそのまま印刷します。非表示の空白文字がなく、BasicやBearerなどのプレフィックスが正しいことを確認します。
- 環境の確認:アプリが正しいサブドメインを対象としていることを確認します。多くのチームは、本番環境の認証情報を含むサンドボックスURLをターゲットにしています。その逆も同様です。
4.スコープとクレームの確認:
- OAuthの場合:/api/v2/OAuth/tokens/currentを呼び出して、現在のスコープをリストします。トークンにリソースに必要なスコープがあることを確認します。
- メッセージング/JWTの場合:JWTペイロードを再検証します。子(キーID)がZendeskの設定と一致し、正しい署名シークレットを使用していることを確認します。
最終的な考察
Zendesk Developer Platformの401エラーと403エラーのほとんどは、予測可能な設定ミスによるものです。認証と承認を分離することで、診断をスピードアップし、信頼性を高めることができます。
資格情報を早期に検証し、スコープとロールを確認し、構造化された診断アプローチに従って問題を迅速に解決し、本番環境での繰り返しを防止します。
詳細については、APIトークンアクセス、OAuth認証、Zendesk App Framework、およびメッセージングJWT認証に関するZendeskのドキュメントを参照してください。
翻訳に関する免責事項:この記事は、お客様の利便性のために自動翻訳ソフ トウェアによって翻訳されたものです。Zendeskでは、翻訳の正確さを期すために相応の努力を払っておりますが、翻訳の正確性につ いては保証いたしません。
翻訳された記事の内容の正確性に関して疑問が生じた場合は、正式版である英語の記事 を参照してください。