web-dev-qa-db-ja.com

Microsoftグラフが「アクセストークンが空です」を返す

私はこのリクエストを投稿します:


POST https://login.microsoftonline.com:443/{my-tennant-here}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com 
Content-Type: application/x-www-form-urlencoded

client_id={client id here}
&scope=https%3A%2F%2Fgraph.Microsoft.com%2F.default
&client_secret={client secret here}
&grant_type=client_credentials
 

これは次を返します:


{
  "token_type": "Bearer",
  "expires_in": 3599,
  "ext_expires_in": 0,
  "access_token": "eyJ0eX......
}
 

Jwt.ioを使用してトークンをデコードしましたが、間違いなく空ではありません。 14のクレームが含まれています。 aud、iss、tidなど...

次に、このリクエストでアクセストークンを使用します


GET https://graph.Microsoft.com/v1.0/users
Athorization: Bearer eyJ0eX...
 

次に、このボディで401Unauthorizedを取得します。


{
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token is empty.",
    "innerError": {
      "request-id": "",
      "date": "2018-08-14T15:41:44"
    }
  }
}
 

期待される結果は200 Okで、本文にはユーザーのリストが含まれています

これは単に私のアプリが無許可であり、エラーメッセージが誤解を招く(アクセストークンが空である)ことを意味しますか?それとも私は何か間違ったことをしましたか?

更新:トークンにはクレームが含まれていますが、スコープクレームがないことに気づきました。これは私には少し奇妙に思えます。 User.Read.Allスコープがあると思います。アプリケーション(クライアントID /クライアントシークレット)には、この権限が必要です。私が受け取ったトークンのクレームには、次のクレームがあります。


aud: "https://graph.Microsoft.com",
iss: "https://sts.windows.net/my tennant id",
iat: timestamp
nbf: timestamp
exp: timestamp
aio: looks like some kind of signature
app_displayname: "the expected app name"
appid: "the expected appid"
appidacr: "1"
idp: "https://sts.windows.net/...."
oid: "GUID"
sub: "GUID"
tid: "my tennant id"
uti: "value"
ver: 1.0 
4
Olav Nybø

Authorizationヘッダーのつづりが間違っていました。

したがって、「アクセストークンが空です」は、実際には存在しないこと、または「リクエストに認証ヘッダーがない」ことを意味している可能性があります。

3
Olav Nybø

一方のURLは機能しますが、もう一方は機能しません。

これは機能します:

endpoint = "https://graph.Microsoft.com/v1.0/reports/getOffice365ActiveUserDetail%28period%3D%27D7%27%29"
headers = {"Authorization": 'Bearer ' + access_token_gmc}
response = requests.get(endpoint, headers=headers)

しかし、これはそうではありません:

endpoint = "https://graph.Microsoft.com/v1.0//users/myuserid/calendars"
headers = {"Authorization": 'Bearer ' + access_token_gmc}
response = requests.get(endpoint, headers=headers)  

スペルが正しいことを確認してください。

2
Suneel

私にとっての問題は、リクエストURLとAuthorizationヘッダーの間に改行を入れて、代わりに本文にしたことでした。

違う:

GET https://graph.Microsoft.com/v1.0/users

Authorization: Bearer {{token}}

正しい:

GET https://graph.Microsoft.com/v1.0/users
Authorization: Bearer {{token}}

ばかげた間違いですが、見落としがちです-この投稿にたどり着いたら、おそらくOP(タイプミス)やこれのようなばかげた間違いをしたでしょう。リクエストの構文をもう一度確認してください。

0
Fredrik Schön

User.Read.Allスコープの場合、ユーザーの同意を得ることができません。管理者の同意が必要です。管理者アカウントを使用してアプリの同意を逃した可能性があります。

このヒットを行うには:

GET https://login.microsoftonline.com/{tenant}/adminconsent
?client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&state=12345
&redirect_uri=http://localhost/myapp/permissions

次に、アクセストークンを取得すると、管理者がユーザーに同意したスコープを取得する必要があります。

0
Chris Johnson