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ライブラリからアクセストークンを取得するにはどうすればよいですか?:
問題は、アクセストークンの代わりに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"]
}),
同じサンプル によれば、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",