web-dev-qa-db-ja.com

ログインページを使用せずにMicrosoft Graph APIにアクセスする

ユーザーの1つのドライブにアクセスして、ドキュメントをアップロードしたり、Graph APIを使用してドキュメントを取得したりします。ユーザーがログインするために標準のログインページを使用する必要があるネット上で複数の例を見てきました。ログインページから認証コードを取得し、それを使用してトークンを取得する必要があります。トークンを使用すると、最終的にドライブなどのリソースにアクセスできます。

ログインページを経由せずにこれを行う方法を探しています。ユーザーにログインを要求できる独自のログインページを作成できます。

要するに、PostmanのようなRESTクライアントを使用して、Graph APIのドライブリソースにアクセスしたいのです(承認からリソースへのアクセスまで)これは可能ですか?

これは可能ですが、個々のユーザーアクセスに対してこれを行わないことを強くお勧めします。 Microsoft GraphはauthZプロトコルとしてOAUTH 2.0のみをサポートします。信頼できる機関が直接処理するものであるOAUTH内のフローを使用することをお勧めしますログイン認証情報:アプリケーションコードがログイン認証情報のフォームUIを提供することを許可すると、アプリがユーザーのO365パスワードに直接アクセスできる攻撃ベクトルが開かれますが、これは安全なアプローチではありません。

2
GarethJ

はい、正しい情報があれば可能です。必要なのは、委任アクセストークンを取得することだけです。

説明:

リソースへのアクセスを処理する場合、Microsoft Graphには2つのレベルのアクセストークン要件があります。

  • ほとんどのメソッドはApplicationトークンのみをサポートします。つまり、OAuthアプリは、必要なときにいつでもリソースにアクセスできることに同意すると、.
  • ただし、一部のメソッドでは十分ではなく(自動化されたプロセスには感度が高すぎます)、Delegatedトークン、つまり両方有効なクライアントとユーザー。各メソッドのドキュメントで、必要なトークンを確認できます。

通常委任されたアクセストークンは、2つの主要なOAuthユーザーインタラクションを必要とするフローの結果です(Authorization Code GrantおよびImplicit Grant)ただし、他の2つのフローから取得することもできます:Resource Owner Credentials GrantおよびOn-Behalf-Of Grant、どちらもMicrosoftによってサポートされています。

これらのフロー(Postmanの例を含む)を使用するために必要なすべての設定方法の完全なガイドについては、私の記事を参照してください。

OAuth REST API を使用してMicrosoft Graphのアクセストークンを取得する==

14
Eran Hertz

はい、可能です。基本的に、ユーザーではなく、グラフAPIへのアクセスアプリケーションアクセスを許可します。

そのようなアクセスのドキュメントはここにあります:

https://developer.Microsoft.com/en-us/graph/docs/concepts/auth_v2_service

すべてのRESTリクエストで送信するには、ベアラートークンをリクエストする必要がありますが、ベアラートークンはユーザーではなくアプリケーション自体のものです。

私は、Graph SDK for .NETを使用するアプリケーションの1つにこれを設定したので、Graph SDK for .NETの具体的な例が必要な場合はお知らせください。

5
Brian Kraemer

特にアプリケーションコンテキストでGraph APIにアクセスしようとする場合、ドキュメントは役に立たないことがわかりました。しかし、ここでアプリケーションのコンテキストでアクセストークンを取得できました。

private static async Task<string> AcquireToken()
{
    var tenant = "yourtenant.onmicrosoft.com";
    var resource = "https://graph.Microsoft.com/";
    var instance = "https://login.microsoftonline.com/";
    var clientID = "YourappID";
    var secret = "YourAppSecret";
    var authority = $"{instance}{tenant}";
    var authContext = new AuthenticationContext(authority);
    var credentials = new ClientCredential(clientID, secret);
    var authResult = await authContext.AcquireTokenAsync(resource, credentials);
    return authResult.AccessToken;
}
1
Chris J