2016-09-06 7 views
8

После этого руководства: https://azure.microsoft.com/en-us/documentation/articles/resource-manager-api-authentication/#_get-objectid-of-application-service-principal-in-user-azure-adТокен доступа отсутствует или неправильно при вызове Graph API

Я достиг той стадии, когда я называю graph.windows.net, чтобы получить ObjectId сервисного принципала пользователя Azure AD.

Когда я делаю вызов, однако, я получаю следующее сообщение:

{"odata.error":{"code":"Authentication_MissingOrMalformed","message":{"lang":"en","value":"Access Token missing or malformed."},"values":null}} 

Я уже пытался заменить ClientId с «onmicrosoft.com» адрес тоже (так что graph.windows .net/appname.onmicrosoft.com/...), все же получил то же сообщение.

+0

Просто комментарий о щедрости: все, что решает вопрос получает награду очевидно. – Asaf

+0

Можете ли вы показать нам образец своего кода? Ошибка в том, что вам не хватает token.so либо вы не отправляете его, либо не отправляете его так, как ожидает API. –

+0

@Asaf У нас была эта проблема при использовании Fiddler для извлечения токена, оказалось, что это было связано с секретом приложения/клиента, содержащим специальные символы, которые необходимо закодировать как часть запроса на токен-носитель. – jimpaine

ответ

4

Проверить ссылку https://github.com/Azure/azure-sdk-for-node/issues/1782

Я продолжал работать в эту проблему. Я использую следующий код, чтобы получить маркер носителя для моего родного приложения:

 var authContext = new AuthenticationContext("AUTHORITY"); 
     string token; 
     try 
     { 
      var authresult = authContext.AcquireToken("MYAPP_ID","MYAPP_CLIENTID","MYAPP_REDIRECTURI"); 
      token = authresult.AccessToken; 
     } 

Используя этот маркер работал отлично для авторизации действия в собственном приложении, но я получаю ту же ошибку, как ОП при попытке используйте тот же токен, что и авторизация для API-интерфейса Graph.

То, что мне нужно было сделать, это получить новый токен специально для API-интерфейса Graph. Я использовал тот же код, что и выше, но использовал "https://graph.windows.net" вместо "MYAPP_ID". Таким образом, чтобы быть ясно, следующий код дал мне правильный маркер OAuth для API Graph:

 var authContext = new AuthenticationContext("AUTHORITY"); 
     string token; 
     try 
     { 
      var authresult = authContext.AcquireToken("https://graph.windows.net","MYAPP_CLIENTID","MYAPP_REDIRECTURI"); 
      token = authresult.AccessToken; 
     } 

Просто убедитесь, что ваше приложение зарегистрировано в Azure имеет необходимые разрешения для доступа к каталогу вашего домена Azure.

Может быть, это полезно для вас!

+0

вызов, который имеет https://graph.windows.net для этапа, который вызывает https://login.microsoftonline.com/ '+ APP_ID +'/OAuth2/Token '? Потому что вызов не работает для меня с graph.windows.net .. – Asaf

+0

Я также попытался позвонить _'https: //login.microsoftonline.com/ '+ tenantId +'/OAuth2/Token'_ (как обычно), но изменил параметр ** client_id ** на graph.windows.net – Asaf

2

Чтобы распространить мой комментарий, мы видели это, когда секрет приложения содержит символы, которым требуется кодировка. Такие, как «+» и «=»

enter image description here

Если вы не используете некоторые из клиента хелперы доступны или тестируют с Скрипач или Почтальон вам потребуется URL кодирования секрет перед вызовом графа апи, так это выглядит, она становится:

«7hIkYG5m7xJQnocThxMc4yPjtbRP7bO41aNC% 2bbrEzvo% 3d»

+1

Вы уверен в этом? когда я сделал это, я получил: «error»: «invalid_client», «error_description»: ошибка проверки учетных данных. Предоставляется недействительный секрет клиента. – Asaf

+0

Просто убедитесь, что это поле ** client_secret ** при отправке POST на https://login.microsoftonline.com/TENANT_ID/OAuth2/Token – Asaf

Смежные вопросы