web-dev-qa-db-ja.com

Microsoft Graph APIトークン検証の失敗

Angular WebアプリケーションでMicrosoft Graph APIを使用します。

最初に msalライブラリを使用して接続します プロファイルでログインしようとすると、このエラーが発生します

私は公式 gitサンプルで言及されているようにアプリを設定しました

MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true
}),

認証が機能し、トークンを取得しました。

私は、ホームページにいるとき、私は、そのトークンを使用してユーザー情報を取得するために、MicrosoftグラフAPIへの第2の要求を作ります。

getProfile() {
  let header= new Headers();
  let tokenid= sessionStorage.getItem('msal.idtoken'); 
  header.set('Authorization', 'Bearer ' + tokenid)
  let url ="https://graph.Microsoft.com/v1.0/me/"
  return this.http.get(url,{headers:header});
}

}

応答で401 Unauthorizedエラーが表示されます:

{
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token validation failure.",
    "innerError": {
      "request-id": "xxxxxx",
      "date": "2018-10-09T22:58:41"
    }
  }
}

MG APIがトークンを受け入れない理由がわかりません。間違った機関URLを使用していますか?

[〜#〜] update [〜#〜]:実際にアクセストークンとは異なるid_tokenを取得することを理解しました。 MS GRAPH API呼び出しを行うためにMSALライブラリからアクセストークンを取得するにはどうすればよいですか?:

6
infodev

問題は、アクセストークンの代わりにid_tokenを使用していることです:

let tokenid= sessionStorage.getItem('msal.idtoken');

以下のようなものを次のようになります。

let tokenid= sessionStorage.getItem('msal.token'); // or msal.accesstoken

更新(フィリップのコメントごと)

アプリケーションで対象とするスコープを選択する必要があります。したがって、ユーザープロファイルが必要なように見えるので、appsScopesプロパティを追加して、アプリが使用するスコープを指定する必要があります。

MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true,
  consentScopes: ["user.read"]
}),
2
Michael Mainer

同じサンプル によれば、HttpInterceptorを添付して、それぞれにアクセストークンを自動的に添付することもできます。 (外部)HTTP呼び出し。

ドキュメントを読んで、次の情報を見つけました。

consentScopes:クライアントが同意する必要のある目的のスコープを表現できるようにします。スコープは、複数のリソース/エンドポイントから取得できます。ここでスコープを渡すことは同意するだけで、クライアントが実際にAPIを呼び出すまでアクセストークンは取得されません。ログイン(認証)のみにMSALを使用している場合、これはオプションです。

HttpInterceptorを使用すると、アクセストークンが付加されるだけでなく、取得されることも示唆されます。表示されているトークンは、おそらくアプリケーションの単なるトークンですが、Graph APIの有効なトークンではありません。

内部的にはgetCachedTokenInternal(scopes: Array<string>, user: User)を使用して、特定のスコープの新しいアクセストークンを取得します コードはこちら このメソッドを使用してそのリソースの新しいトークンを取得できるかどうかはわかりません。インターセプターを使用するだけです。

アクセストークンをコピーして、 jwt.ms (Microsoft提供のJWTトークンビューアー)または jwt.io でどのように表示されるかを確認できます。

Graphで有効なトークンには、Audienceof https://graph.Microsoft.com。したがって、jwt.msでトークンを検査する場合、少なくともこの値が必要です。

"aud": "https://graph.Microsoft.com",
2
Stephan