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

適用対象について

本ドキュメントは、以下のタイプのアプリに適用されます。
  • H5 マイクロアプリ
  • ミニプログラムアプリ(組織ミニプログラムを含む)
アプリタイプによってサイレントログインの実装方法が若干異なります。実際のアプリシナリオに応じて、正しい認可コードの取得方法を選択してください。 対応するタイプのアプリを作成する方法については、こちらを参照してください:アプリタイプの紹介

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

サイレントログイン」とは、ユーザーがアプリにアクセスした際、DingTalk のユーザー名とパスワードを入力することなく、アプリが現在のユーザー ID を自動的に取得してログインを完了するフローを指します。 このフローは一時的な認可コードのメカニズムに基づいて実装されています。フロントエンドが JSAPI を介して使い捨ての一時認可コード tmp_auth_code を取得し、サーバーサイドがそのコードを使用して DingTalk オープンプラットフォームの API を呼び出し、ユーザーの userId などの ID 情報と交換します。 重要な用語の説明tmp_auth_code は、フロントエンドの JSAPI(dd.getAuthCodedd.runtime.permission.requestAuthCode など)を介して取得される使い捨ての一時認可コードで、有効期間は 5 分間、一度のみ使用可能です。サーバーサイドはこれを DingTalk API(/user/get など)に渡し、ユーザー ID 情報と交換する必要があります。

実行可能なサンプル

フロントエンドコード(H5 マイクロアプリ)

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

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

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_codeauthCode など)。
  • パラメータが 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 を再取得してサーバーサイドに送信し、永続認可コードの作成に使用してください。