2014-09-12 3 views
1

Я пишу веб-приложение, которое будет обращаться к данным клиента, хранящимся в Microsoft Dynamics CRM Online. Я хочу разрешить моим пользователям предоставлять доступ к своей учетной записи Dynamics с помощью OAuth.Как обменять код авторизации для access_token для приложения Azure AD Multi-Tenant?

  1. Я создал заявку на многопользовательскую в Azure AD, обеспечивая redirect_uris, генерируя идентификатор клиента & секрет. Multi-tennant установлен в положение ON.
  2. Я создал демоверсию Microsoft Dynamics CRM. "Examplecrmaccount.crm4.dynamics.com".
  3. Я успешно сгенерировал URL-адрес авторизации, отправил пользователей на экран авторизации и получил «код», который должен быть обменен на «токен доступа».

Я не могу обменять этот «код» для «access_token».

$data = array(
    "grant_type" => "authorization_code", 
    "client_id" => urlencode("my_app_azure_ad_client_id"), 
    "redirect_uri" => urlencode("https://myapp.com/callback"), 
    "client_secret" => urlencode("my_app_azure_ad_client_secret"), 
    "code" => urlencode("code_returned_from_previous_request"), 
    "resource" => urlencode("https://examplecrmaccount4.crm4.dynamics.com") 
); 

$endpoint = "https://login.windows.net/common/oauth2/token?api-version=1.0"; 

$response = helpers\Curl::doPOST(
    $endpoint, 
    null,  
    array("Content-type: application/x-www-form-urlencoded"), 
    $data 
); 

Ответ сервера:

Status 404 
StatusName Not Found 
{"error":"invalid_request","error_description":"ACS90002: No service namespace named \u0027common\u0027 was found in the data store.\r\nTrace ID: b1025082-3e9b-49d8-bf91-7d998f694162\r\nCorrelation ID: 49d9d1e5-6958-4ffc-91ff-464f078a00f5\r\nTimestamp: 2014-09-12 08:35:59Z","error_codes":[90002],"timestamp":"2014-09-12 08:35:59Z","trace_id":"b1025082-3e9b-49d8-bf91-7d998f694162","correlation_id":"49d9d1e5-6958-4ffc-91ff-464f078a00f5"} 

ответ

2

Удалить "апи-версия = 1.0" из параметров запроса, и он должен работать. Это ошибка в наших документах и ​​портале Azure, чтобы сказать вам добавить это, когда вы используете поток кода авторизации.

+0

Извлечение «api-version = 1.0» из этого (и запрос URL-адреса авторизации «/ common/oauth2/authorize») сделал трюк. Я получаю: {"error": "invalid_request", "error_description": "AADSTS90011: значение redirect_uri должно быть допустимым абсолютным Uri. \ R \ nTrace ID: 035a0c90-bc8f-444c-8723-e8d9aea033bb \ r \ nКорреляционный идентификатор: 58c6fc52-cf50-44ae-8622-cc4aa3259bac \ r \ nПримечание: 2014-09-22 17: 08: 02Z "," error_codes ": [90011]," timestamp ":" 2014-09-22 17 : 08: 02Z», "trace_id": "035a0c90-bc8f-444c-8723-e8d9aea033bb", "correlation_id": "58c6fc52-cf50-44ae-8622-cc4aa3259bac", "submit_url": нулевой, "контекст": нулевая}) – dclaysmith

+0

К сожалению, я этого раньше не заметил. В приложении с несколькими арендаторами значение redirect_uri ДОЛЖНО относиться к имени арендатора Azure AD. Например, если ваш арендатор contoso.com, то redirect_uri должен иметь форму https://contoso.com/ . Я думаю, что в этом случае имя вашего арендатора - crm4.dynamics.com. – user4067195

+0

Извините, это тоже не так, я запутался с URI. Недостаточно кофе. Подожди. – user4067195