Авторизовать клиента для просмотра API-интерфейса Office365
Я пытаюсь разработать 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, так как эта проблема сводила меня с ума, и я бы никогда не смог разобраться без их помощи.
К сожалению, я могу присудить награду только одному из них, поэтому я решил дать ему @Джейсона Джонстона за великое терпение, которое он оказал мне в этом и другом обсуждении.
Ответы
Ответ 1
Я считаю, что если вы действительно хотите просматривать Active Directory, а не просто читать аутентифицированный профиль пользователя, вам необходимо получить согласие администратора на веб-приложение. См. http://msdn.microsoft.com/en-us/library/azure/b08d91fa-6a64-4deb-92f4-f5857add9ed8#BKMK_Graph
Если вы уже это знали, возможно, это проблема с тем, как вы зарегистрировали свое приложение или сам токен. Убедитесь, что вы выбрали соответствующие разрешения для этой ссылки в вашей регистрации приложения. Если они выглядят правильно, вы можете проверить токен. Здесь есть удобный небольшой парсератор: http://jwt.calebb.net/. Просто вставьте значение своего токена, и он покажет вам декодированный JSON. Посмотрите параметры области видимости или scp.
{
"typ": "JWT",
"alg": "RS256",
"x5t": "asdfsadfasdfsa"
}
{
"aud": "https://graph.windows.net/",
"iss": "https://sts.windows.net/<SOMEGUID>",
"iat": 1418158549,
"nbf": 1418158549,
"exp": 1418162449,
"ver": "1.0",
"tid": "<SOMEGUID>",
"amr": [
"pwd"
],
"oid": "<SOMEGUID>",
"upn": "[email protected]",
"unique_name": "[email protected]",
"sub": "askdljalsdfs",
"puid": "1003BFFD88937280",
"family_name": "Administrator",
"given_name": "MOD",
"appid": "<YOUR APP ID>",
"appidacr": "0",
"scp": "Directory.Read user_impersonation UserProfile.Read",
"acr": "1"
}
Ответ 2
В маркете, который вы вставили, отсутствует OID и UPN, и, вероятно, именно поэтому вы видите эту ошибку. Мне придется вернуться и проверить, как этот токен доступа мог быть выпущен без этих претензий.