> ## Documentation Index
> Fetch the complete documentation index at: https://help.dingtalk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# よくある質問

> 開発者がDingTalkのH5マイクロアプリとミニプログラムアプリのサイレントログイン実装でのエラーを特定し対処できます

本記事では、DingTalk のサイレントログイン機能に関するよくある質問と解決策を紹介し、開発者が権限付与プロセスでのエラーを迅速に特定して対処できるよう支援します。

## 適用対象について

本ドキュメントは、以下のタイプのアプリに適用されます。

* H5 マイクロアプリ
* ミニプログラムアプリ（組織ミニプログラムを含む）

アプリタイプによってサイレントログインの実装方法が若干異なります。実際のアプリシナリオに応じて、正しい認可コードの取得方法を選択してください。

対応するタイプのアプリを作成する方法については、こちらを参照してください：[アプリタイプの紹介](https://open.dingtalk.com/document/development/introduction-to-application-types)。

## サイレントログインのフロー概要

「**サイレントログイン**」とは、ユーザーがアプリにアクセスした際、DingTalk のユーザー名とパスワードを入力することなく、アプリが現在のユーザー ID を自動的に取得してログインを完了するフローを指します。

このフローは一時的な認可コードのメカニズムに基づいて実装されています。フロントエンドが JSAPI を介して使い捨ての一時認可コード `tmp_auth_code` を取得し、サーバーサイドがそのコードを使用して DingTalk オープンプラットフォームの API を呼び出し、ユーザーの `userId` などの ID 情報と交換します。

**重要な用語の説明**：`tmp_auth_code` は、フロントエンドの JSAPI（`dd.getAuthCode` や `dd.runtime.permission.requestAuthCode` など）を介して取得される使い捨ての一時認可コードで、有効期間は 5 分間、一度のみ使用可能です。サーバーサイドはこれを DingTalk API（`/user/get` など）に渡し、ユーザー ID 情報と交換する必要があります。

## 実行可能なサンプル

### フロントエンドコード（H5 マイクロアプリ）

```text theme={"theme":{"light":"github-light","dark":"github-dark"}}
// dd SDK を使用して一時認可コードを取得
dd.ready(function() {
  dd.runtime.permission.requestAuthCode({
    corpId: "your_corp_id", // 企業 ID に置き換えてください
    onSuccess: function(result) {
      const code = result.code; // tmp_auth_code を取得
      // サーバーサイドに送信
      fetch('/api/login', {
        method: 'POST',
        body: JSON.stringify({ tmp_auth_code: code }),
        headers: { 'Content-Type': 'application/json' }
      });
    },
    onFail: function(err) {
      console.error('認可コードの取得に失敗:', err);
    }
  });
});
```

## よくあるエラーコードの解説

さまざまなサイレントログインのシナリオで発生する可能性のあるエラーとその原因は以下のとおりです。

### errcode=40078, errmsg=存在しない一時認可コード

考えられる原因は以下のとおりです。

* **サイレントログインの認可コードを正しく取得していない**

  * ミニプログラムアプリの場合は `dd.getAuthCode` を介して取得してください。
  * H5 マイクロアプリの場合は `dd.runtime.permission.requestAuthCode` または `dd.runtime.permission.requestOperateAuthCode` を介して取得してください。
* **認可コードの有効期限切れ**

  * サイレントログインの認可コードは生成後、有効期間が **5 分間** で、時間を超過すると失効します。
* **認可コードが既に使用されている**

  * サイレントログインの認可コードは使い捨ての認証情報であり、一度使用すると失効するため、繰り返し呼び出すことはできません。
* **認可コードのタイプの混用**

  * 例：管理コンソールのサイレントログイン認可コードを社内アプリの API に渡してユーザーの `userId` を取得しようとすると、このエラーが発生します。

### errcode=41007, errmsg=無効な ssoCode

考えられる原因は以下のとおりです。

* **ssoCode が存在しない、またはスペルミス**

  * フロントエンドから渡された `ssoCode` パラメータの値が完全で、切り取られていないかを確認してください。
* **ssoCode の有効期限切れ**

  * ssoCode は通常、有効期間が短い（約 5 分間）ため、速やかに使用してください。
* **ssoCode が既に消費されている**

  * このコードは使い捨てで、他のリクエストで既に使用されている場合、後続の呼び出しは失敗します。

### errcode=41026, errmsg=tmp\_auth\_code がありません

考えられる原因は以下のとおりです。

* リクエストパラメータに `tmp_auth_code` フィールドが含まれていない。
* パラメータ名のスペルミス（`temp_auth_code` や `authCode` など）。
* パラメータが QueryString を介して正しく渡されていない（`?tmp_auth_code=xxx` の形式である必要があります）。
* フロントエンドが認可コードを正常に返さず、サーバーサイドが完全なリクエストを構築できない。

> 解決策：フロントエンドが正しくコールバックして `code` の値を渡しているか確認し、サーバーサイドが `tmp_auth_code` パラメータを明示的に受け取るようにしてください。

### errcode=40079, errmsg=存在しない権限付与情報

考えられる原因は以下のとおりです。

* アプリの権限付与フローがまだ完了しておらず、ユーザーがログイン確認を完了していない。
* ユーザーがアプリの可視範囲内のメンバーではない（連絡先に登録されていない、またはアクセス権が付与されていないなど）。
* アプリ権限が正しく設定されておらず、「サイレントログイン」関連の機能がオンになっていない。
* 呼び出しタイミングが早すぎ、ユーザーコンテキストが準備完了していない状態で認可コードの取得を試みている。

> 推奨事項：呼び出し前に判定ロジックを追加し、ユーザーがアプリにアクセスしておりクライアントサイドの環境が準備完了していることを確認してください。

### errcode=40087, errmsg=永続認可コードの作成に失敗

考えられる原因は以下のとおりです。

* 現在のアプリタイプが永続認可コードの作成をサポートしていない。
* 必要な権限設定が不足している（「永続権限付与」権限がオンになっていないなど）。
* API の呼び出し頻度が高すぎ、レート制限メカニズムがトリガーされている。
* アプリの状態が異常（無効化されている、審査中など）。

### errcode=40091, errmsg=tmp\_auth\_code がありません

考えられる原因は以下のとおりです。

* 永続認可コードの作成時に、有効な一時認可コード（`tmp_auth_code`）が提供されていない。
* ユーザーが権限付与アクションを完了しておらず、一時コードが空になっている。
* パラメータが作成 API に正しく渡されていない。

> 解決策：ユーザーに再度権限付与を促し、フロントエンドから `authCode` を再取得してサーバーサイドに送信し、永続認可コードの作成に使用してください。
