認証の種類
拡張機能では、1 つ以上の種類の認証をサポートできます。 認証の種類はそれぞれ異なる種類の資格情報です。 Power Query でエンド ユーザーに表示される認証 UI は、拡張機能がサポートする資格情報の種類によって駆動されます。
サポートされている認証の種類の一覧は、拡張機能の データ ソースの種類 の定義の一部として定義されます。 各認証値は、特定のフィールドを持つレコードです。 次の表に、各種類の想定されるフィールドを示します。 特に指定がない限り、すべてのフィールドが必要です。
| 認証の種類 | フィールド | Description |
|---|---|---|
| アノニマス | 匿名 ( Implicitとも呼ばれます) 認証の種類にはフィールドがありません。 |
|
| OAuth | ログイン開始 | OAuth フローを開始するための URL と状態情報を提供する関数。 「 OAuth フローの実装」 セクションに移動します。 |
| ログイン完了 | OAuth フローに関連するaccess_tokenとその他のプロパティを抽出する関数。 | |
| リフレッシュ | (省略可能) 更新トークンから新しいアクセス トークンを取得する関数。 | |
| Logout | (省略可能) ユーザーの現在のアクセス トークンを無効にする関数。 | |
| ラベル | (省略可能) この AuthenticationKind の既定のラベルをオーバーライドできるテキスト値。 | |
| Aad | AuthorizationUri |
text 値または Microsoft Entra ID 承認エンドポイントを返す単項関数 (例: "https://login.microsoftonline.com/common/oauth2/authorize")。Microsoft Entra ID 認証セクションに移動します。 |
| Resource |
text サービスの Microsoft Entra ID リソース値を返す値または単項関数。 |
|
| Scope |
(省略可能)text 認証フローの一部として要求するスコープの一覧を返す値または単項関数。 複数のスコープ値はスペースで区切る必要があります。 スコープの値は、アプリケーション ID URI を使用せずにスコープ名にする必要があります (例: Data.Read)。 指定しない場合は、 user_impersonation スコープが要求されます。 |
|
| ユーザー名パスワード | ユーザー名ラベル | (省略可能) 資格情報 UI の [ユーザー名 ] テキスト ボックスの既定のラベルを置き換えるテキスト値。 |
| パスワードラベル | (省略可能) 資格情報 UI の [パスワード ] テキスト ボックスの既定のラベルを置き換えるテキスト値。 | |
| ラベル | (省略可能) この AuthenticationKind の既定のラベルをオーバーライドできるテキスト値。 | |
| ウィンドウズ | ユーザー名ラベル | (省略可能) 資格情報 UI の [ユーザー名 ] テキスト ボックスの既定のラベルを置き換えるテキスト値。 |
| パスワードラベル | (省略可能) 資格情報 UI の [パスワード ] テキスト ボックスの既定のラベルを置き換えるテキスト値。 | |
| ラベル | (省略可能) この AuthenticationKind の既定のラベルをオーバーライドできるテキスト値。 | |
| Key | KeyLabel | (省略可能) 資格情報 UI の API キー テキスト ボックスの既定のラベルを置き換えるテキスト値。 |
| ラベル | (省略可能) この AuthenticationKind の既定のラベルをオーバーライドできるテキスト値。 |
次の例は、OAuth、キー、Windows、Basic (ユーザー名とパスワード)、匿名資格情報をサポートするコネクタの認証レコードを示しています。
Example:
Authentication = [
OAuth = [
StartLogin = StartLogin,
FinishLogin = FinishLogin,
Refresh = Refresh,
Logout = Logout
],
Key = [],
UsernamePassword = [],
Windows = [],
Anonymous = []
]
現在の資格情報へのアクセス
現在の資格情報は、 Extension.CurrentCredential 関数を使用して取得できます。
拡張機能が有効になっている M データ ソース関数は、拡張機能の資格情報スコープを自動的に継承します。 ほとんどの場合、現在の資格情報に明示的にアクセスする必要はありませんが、次のような例外があります。
- カスタム ヘッダーまたはクエリ文字列パラメーターで資格情報を渡す (API キー認証の種類を使用している場合など)。
- ODBC または ADO.NET 拡張機能の接続文字列プロパティの設定。
- OAuth トークンのカスタム プロパティのチェック。
- OAuth v1 フローの一部として資格情報を使用する。
Extension.CurrentCredential関数は、レコード オブジェクトを返します。 含まれるフィールドは認証の種類固有です。 次の表に詳細を示します。
| フィールド | Description | 使用ページ |
|---|---|---|
| AuthenticationKind | この資格情報に割り当てられた認証の種類の名前 (UsernamePassword、OAuth など) が含まれます。 | All |
| ユーザー名 | ユーザー名の値 | ユーザー名とパスワード 、Windows |
| パスワード | パスワード値。 通常、UsernamePassword と共に使用されますが、Key にも設定されます。 | キー、ユーザー名パスワード、Windows |
| access_token | OAuth アクセス トークンの値。 | OAuth |
| プロパティ | 特定の資格情報の他のカスタム プロパティを含むレコード。 通常、認証フロー中にaccess_tokenで返された他のプロパティ (refresh_token など) を格納するために OAuth と共に使用されます。 | OAuth |
| Key | API キーの値。 キー値は[パスワード]フィールドでも使用できます。 既定では、マッシュアップ エンジンは、この値が基本認証パスワード (ユーザー名なし) であるかのように、Authorization ヘッダーにこのキーを挿入します。 この種類の動作が必要でない場合は、オプション レコードで ManualCredentials = true オプションを指定する必要があります。 | Key |
| EncryptConnection | データ ソースへの暗号化された接続を必要とするかどうかを決定する論理値。 この値はすべての認証の種類で使用できますが、 データ ソース 定義で EncryptConnection が指定されている場合にのみ設定されます。 | All |
次のコード サンプルでは、API キーの現在の資格情報にアクセスし、それを使用してカスタム ヘッダー (x-APIKey) を設定します。
Example:
MyConnector.Raw = (_url as text) as binary =>
let
apiKey = Extension.CurrentCredential()[Key],
headers = [
#"x-APIKey" = apiKey,
Accept = "application/vnd.api+json",
#"Content-Type" = "application/json"
],
request = Web.Contents(_url, [ Headers = headers, ManualCredentials = true ])
in
request
OAuth フローの実装
OAuth 認証の種類では、拡張機能でサービスのカスタム ロジックを実装できます。
これを行うために、拡張機能は、 StartLogin (OAuth フローを開始するための承認 URI を返す) と FinishLogin (アクセス トークンの承認コードの交換) のための関数を提供します。 拡張機能は必要に応じて、 Refresh (新しいアクセス トークンの更新トークンの交換) と Logout (現在の更新トークンとアクセス トークンの期限切れ) 機能も実装できます。
注
Power Query 拡張機能は、クライアント コンピューターで実行されているアプリケーションで評価されます。 ユーザーは拡張機能またはネットワーク トラフィックを検査してシークレットを学習する可能性があるため、データ コネクタは OAuth フローで機密シークレットを使用 しないでください 。 共有シークレットに依存しないフローの提供の詳細については、 OAuth パブリック クライアント RFC (PKCE とも呼ばれます) による Code Exchange の Proof Key に関するページを参照してください。 このフローの 実装例 は、GitHub サイトにあります。
OAuth 関数シグネチャには、最小限の数のパラメーターを含む元の署名と、より多くのパラメーターを受け入れる高度な署名の 2 つのセットがあります。 ほとんどの OAuth フローは、元の署名を使用して実装できます。 また、実装でシグネチャの種類を混在させ、一致させることもできます。 関数呼び出しは、パラメーター (およびその型) の数に基づいて一致します。 パラメーター名は考慮されません。
詳細については、 GitHub サンプル を参照してください。
元の OAuth 署名
StartLogin = (dataSourcePath, state, display) => ...;
FinishLogin = (context, callbackUri, state) => ...;
Refresh = (dataSourcePath, refreshToken) => ...;
Logout = (accessToken) => ...;
高度な OAuth 署名
高度な署名に関する注意事項:
- すべての署名は
clientApplicationレコード値を受け入れます。これは将来使用するために予約されています。 - すべての署名は、
dataSourcePathを受け入れます (ほとんどのサンプルではresourceUrlとも呼ばれます)。 -
Refresh関数は、oldCredentialパラメーターを受け取ります。これは、record関数によって返された前のFinishLogin(または以前のRefreshの呼び出し) です。
StartLogin = (clientApplication, dataSourcePath, state, display) => ...;
FinishLogin = (clientApplication, dataSourcePath, context, callbackUri, state) => ...;
Refresh = (clientApplication, dataSourcePath, oldCredential) => ...;
Logout = (clientApplication, dataSourcePath, accessToken) => ...;
Microsoft Entra ID 認証
Aad認証の種類は、Microsoft Entra ID の OAuth の特殊なバージョンです。 組織アカウント認証をサポートする組み込みの Power Query コネクタと同じ Microsoft Entra ID クライアントを使用します。 詳細については、 カスタム コネクタの Microsoft Entra の構成に関する クイック スタート ガイドを参照してください。
注
Microsoft Entra ID 用に独自の OAuth フローを実装する場合、テナントの 条件付きアクセス を有効にしたユーザーは、Power BI サービスを使用して更新するときに問題が発生する可能性があります。 これはゲートウェイベースの更新には影響しませんが、Power BI サービスからの更新をサポートする認定コネクタに影響します。 Power BI サービスを使用して Web ベースの資格情報を構成するときに、 パブリック クライアント アプリケーション を使用してコネクタに起因する問題が発生する可能性があります。 このフローによって生成されるアクセス トークンは、最終的に、最初に認証に使用されたもの (つまり、会社のネットワーク上でデータ ソース資格情報を構成するユーザーのコンピューター) とは異なるコンピューター (つまり、会社のネットワーク上ではなく、Azure データ センター内の Power BI サービス) で使用されます。 組み込みの Aad の種類では、Power BI サービスで資格情報を構成するときに別の Microsoft Entra ID クライアントを使用することで、この問題を回避できます。 このオプションは、 OAuth 認証の種類を使用するコネクタでは使用できません。
ほとんどのコネクタでは、 AuthorizationUri フィールドと Resource フィールドの値を指定する必要があります。 どちらのフィールドも、値 text することも、 text valueを返す 1 つの引数関数にすることもできます。
AuthorizationUri = "https://login.microsoftonline.com/common/oauth2/authorize"
AuthorizationUri = (dataSourcePath) => FunctionThatDeterminesAadEndpointFromDataSourcePath(dataSourcePath)
Resource = "44445555-eeee-6666-ffff-7777aaaa8888" // Microsoft Entra ID resource value for your service - Guid or URL
Resource = (dataSourcePath) => FunctionThatDeterminesResourceFromDataSourcePath(dataSourcePath)
Uri ベースの識別子を使用するコネクタは、Resource値を指定する必要はありません。 既定では、値はコネクタの Uri パラメーターのルート パスと同じです。
データ ソースの Microsoft Entra ID リソースがドメイン値と異なる場合 (GUID を使用するなど)、 Resource 値を指定する必要があります。
Aad 認証の種類のサンプル
次の場合、データ ソースは共通テナントを使用してグローバル クラウドの Microsoft Entra ID をサポートします (Azure B2B はサポートされません)。 .default スコープを要求すると、Power Query クライアント アプリケーション ID に対して以前に承認されたすべてのスコープを持つトークンが返されます。
Authentication = [
Aad = [
AuthorizationUri = "https://login.microsoftonline.com/common/oauth2/authorize",
Resource = "44445555-eeee-6666-ffff-7777aaaa8888", // Entra Application ID URI or app guid
Scope = ".default"
]
]
次の場合、データ ソースは OpenID Connect (OIDC) または同様のプロトコルに基づくテナント検出をサポートします。 この機能により、コネクタは、データ ソース パス内の 1 つ以上のパラメーターに基づいて、使用する正しい Microsoft Entra ID エンドポイントを決定できます。 この動的検出アプローチにより、コネクタは Azure B2B をサポートできます。
// Implement this function to retrieve or calculate the service URL based on the data source path parameters
GetServiceRootFromDataSourcePath = (dataSourcePath) as text => ...;
GetAuthorizationUrlFromWwwAuthenticate = (url as text) as text =>
let
// Sending an unauthenticated request to the service returns
// a 302 status with WWW-Authenticate header in the response. The value will
// contain the correct authorization_uri.
//
// Example:
// Bearer authorization_uri="https://login.microsoftonline.com/{tenant_guid}/oauth2/authorize"
responseCodes = {302, 401},
endpointResponse = Web.Contents(url, [
ManualCredentials = true,
ManualStatusHandling = responseCodes
])
in
if (List.Contains(responseCodes, Value.Metadata(endpointResponse)[Response.Status]?)) then
let
headers = Record.FieldOrDefault(Value.Metadata(endpointResponse), "Headers", []),
wwwAuthenticate = Record.FieldOrDefault(headers, "WWW-Authenticate", ""),
split = Text.Split(Text.Trim(wwwAuthenticate), " "),
authorizationUri = List.First(List.Select(split, each Text.Contains(_, "authorization_uri=")), null)
in
if (authorizationUri <> null) then
// Trim and replace the double quotes inserted before the url
Text.Replace(Text.Trim(Text.Trim(Text.AfterDelimiter(authorizationUri, "=")), ","), """", "")
else
error Error.Record("DataSource.Error", "Unexpected WWW-Authenticate header format or value during authentication.", [
#"WWW-Authenticate" = wwwAuthenticate
])
else
error Error.Unexpected("Unexpected response from server during authentication.");
<... snip ...>
Authentication = [
Aad = [
AuthorizationUri = (dataSourcePath) =>
GetAuthorizationUrlFromWwwAuthenticate(
GetServiceRootFromDataSourcePath(dataSourcePath)
),
Resource = "https://myAadResourceValue.com", // Microsoft Entra ID resource value for your service - Guid or URL
Scope = ".default"
]
]
その他の種類の認証
Kerberos ベースのシングル サインオンなど、この記事で取り上げられない他の種類の認証の詳細については、 追加のコネクタ機能 に関する記事を参照してください。