Я пытаюсь разработать webapp, чтобы позволить пользователю просматривать его контакты в Active Directory.
У меня есть две учетные записи: одна для регистрации приложения (учетной записи разработчика), а другая - для обычного пользователя, у которого есть доступ к Office365 (учетная запись пользователя).
Я создал клиент Javascript, следуя API API Azure AD Graph.
К настоящему моменту я могу предложить пользователю войти в систему и получить токен доступа, но когда я пытаюсь сделать запрос, я всегда получаю ошибку 401.
Я новичок в Azure, поэтому я действительно не понимаю, проблема в моей конфигурации приложения или в моем коде.
Я могу просматривать API-интерфейс графического API с моей учетной записью пользователя, поэтому я не думаю, что он пропустил авторизацию для доступа к нему.
Я действительно смущен.
Я пытаюсь добавить все шаги, которые я делаю, надеясь, что кто-то может указать на ошибку.
Запрос 1:
Url: https://login.windows.net/{my tenant id or common (both are working) }/oauth2/authorize
Method: GET
Params:
redirect_uri // my redirect url, the same I registered in my application. It is just a page that returns the content of the URL
client_id // my client id
response_type // code
state // a random generated string, not required, but reccomanded
resource // https://graph.windows.net
Ответ 1:
code // A long string
state // The string I sent in the request
session_state // Another string
Запрос 2:
Url: https://login.windows.net/{my tenant id or common (both are working) }/oauth2/token
Method: POST
Params:
redirect_uri // it won't be necessary, but in some post they reccomand to add it
client_id // my client id
client_secret // my client secret
code // the code retrieved from Request 1
grant_type // authorization_code
state // a random generated string
resource // https://graph.windows.net
Ответ 2:
token_type // Bearer
access_token // a long token
id_token // exploring it with the JWT tool, shows it has the correct app id
refresh_token // a long code
resource // the same I sent in the request
scope // Directory.Read UserProfile.Read
expires_in
expires_on
a couple of other irrelevant keys
Запрос 3:
Url: https://graph.windows.net/{the domain the logged account belong to}/contacts
Method: GET
Headers:
Authorization: Bearer {the access token retrieved from request 2}
Params:
api-version = 1.5 // The value suggested in the documentation.
Ответ 3:
{
"odata.error": {
"code": "Authentication_MissingOrMalformed",
"message": {
"lang": "en",
"value": "Access Token missing or malformed."
},
"values": null
}
}
Это содержимое моего токена доступа:
{
typ: "JWT",
alg: "RS256",
x5t: "foofoofoofoo"
}.
{
aud: "https://graph.windows.net",
iss: "https://sts.windows.net/<SOMEGUID>/",
iat: 1418224761,
nbf: 1418224761,
exp: 1418228661,
ver: "1.0",
tid: "<SOMEGUID>",
amr: [
"pwd"
],
idp: "https://sts.windows.net/<SOMEGUID>/",
email: "[email protected]",
unique_name: "[email protected]",
sub: "barbarbarbar",
altsecid: "<an-id>",
family_name: "Last Name",
given_name: "First Name",
appid: "<MY APP ID>",
appidacr: "1",
scp: "Directory.Read UserProfile.Read",
acr: "1"
}
Ответ
Итак, похоже, что пользователь должен иметь авторизацию "согласен" для аутентификации в своем собственном активном каталоге, и это может быть предоставлено администратором.
Я отправил тот же запрос на форум MSDN, и я получил тот же ответ.
Я хочу искренне поблагодарить @Jason Johnston и @Dan Kershaw, так как эта проблема сводила меня с ума, и я бы никогда не смог разобраться без их помощи.
К сожалению, я могу присудить награду только одному из них, поэтому я решил дать ему @Джейсона Джонстона за великое терпение, которое он оказал мне в этом и другом обсуждении.