日: 2023年3月1日

  • ValueError: Public Client should not possess credentials

    python で AzureAD の認証をする際 msal を使うことが多いが、

    PublicClientApplicationクラスに証明書を渡すと、

    ValueError: Public Client should not possess credentials というエラーになる。

    対処法として ConfidentialClientApplication クラスを使うことで回避できる。

    PublicClientApplicationクラスはパブリッククライアントを表し、アプリケーション自体が認証されることはないため、証明書の提供はサポートされていない。

    証明書ベースの認証には、ConfidentialClientApplicationクラスを使用する必要がある。

    このクラスは機密クライアントを表し、アプリケーション自体が認証されるため、証明書の提供が必要となるという理由

    以下、サンプルコード

    from msal import ConfidentialClientApplication
    
    client_id = 'YOUR_CLIENT_ID'
    tenant_id = 'YOUR_TENANT_ID'
    client_secret = 'YOUR_CLIENT_SECRET'
    authority = f'https://login.microsoftonline.com/{tenant_id}'
    
    app = ConfidentialClientApplication(
        client_id=client_id,
        client_credential=client_secret,
        authority=authority
    )
    
    result = None
    result = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])
    
    if "access_token" in result:
        print(result['access_token'])
    else:
        print(result.get("error"))
        print(result.get("error_description"))
        print(result.get("correlation_id"))