Поток OAuth authorization_code не авторизован, если это не сделано через Почтальона - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь заставить приложение работать с платформой Microsoft Identity.

Отправка запроса OAuth через Postman, похоже, работает, но когда я пытаюсь самостоятельно ввести тип разрешения authorizaton_code, несмотря на получение доступатокен, API, к которому я пытаюсь получить доступ, всегда выдает мне неавторизованную ошибку.

Я отправляю запрос POST по адресу:

https://login.windows.net/<tenant_id>/oauth2/authorize?resource=<resource_uri>

С данными тела:

grant_type=authorization_code&
client_id=<client_id>&
redirect_uri=<redirect_uri>&
response_type=code

Это дает мне перенаправление на мой URI с кодом в строке запроса

Затем я запрашиваю токен доступа с кодом, отправив POST по адресу:

https://login.windows.net/<tenant_id>/oauth2/token?resource=<resource_uri>

Со следующим содержимым:

grant_type=authorization_code&
client_id=<client_id>&
redirect_uri=<redirect_uri>&
code=<the_code_from_the_redirect>&
client_secret=<client_secret>

Это возвращает мне токен доступа:

{
    "token_type": "Bearer",
    "expires_in": "3599",
    "ext_expires_in": "3599",
    "expires_on": "1557783183",
    "not_before": "1557779283",
    "resource": "00000002-0000-0000-c000-000000000000",
    "access_token": "<access_token_here>",
    "refresh_token": "<refresh_token>",
    "id_token": "<id_token>"
}

Но этот токен нене работает при вызове ресурса:

{
    "error": {
        "code": "Unauthorized",
        "message": "The credentials provided are incorrect"
    }
}

То же самое с использованием функции Get New Access Token в Postman, похоже, создает тот же запрос post в консоли Postman (хотя и с другим кодом, но он долженполучить новый код, потому что я уже выкупилили он ничего не знает об этом, верно?) но возвращаемый маркер доступа работает:

{
    "error": {
        "code": "NoLicense",
        "message": "User has no license"
    }
}

(не обращайте внимания на тот факт, что это ошибка - у пользователя нет лицензии на приложение, которое я пробуюна запрос, но это нормально)

Я делаю что-то в корне неправильно?Из того, что я вижу, я правильно слежу за потоком OAuth.

1 Ответ

0 голосов
/ 14 мая 2019

Понял это - это потому, что я передавал ресурс как часть строки запроса, а не как часть формы.

Когда платформа идентификации генерирует перенаправление / обратный вызов, кажется, что она включает в себя только элементы строки запроса при выполнении GET или элементы формы при выполнении POST.

Вы можете увидеть это ниже:

<html>
    <head>
        <title>Continue</title>
    </head>
    <body>
        <form method="POST" name="hiddenform" action="https://login.microsoftonline.com/<tenant_id>/oauth2/authorize">
            <input type="hidden" name="grant_type" value="authorization_code" />
            <input type="hidden" name="client_id" value="<client_id>" />
            <input type="hidden" name="redirect_uri" value="https://businesscentral.dynamics.com" />
            <input type="hidden" name="response_type" value="code" />
            <input type="hidden" name="scope" value="" />
            <noscript>
                <p>Script is disabled. Click Submit to continue</p>
                <input type="submit" value="Submit" />
            </noscript>
        </form>
        <script language="javascript">window.setTimeout('document.forms[0].submit()', 0);</script>
    </body>
</html>

После добавления resource к данным формы вместо URL я получил немного другое перенаправление:

<html>
    <head>
        <title>Continue</title>
    </head>
    <body>
        <form method="POST" name="hiddenform" action="https://login.microsoftonline.com/<tenant_id>/oauth2/authorize">
            <input type="hidden" name="grant_type" value="authorization_code" />
            <input type="hidden" name="client_id" value="<client_id>" />
            <input type="hidden" name="redirect_uri" value="https://businesscentral.dynamics.com" />
            <input type="hidden" name="response_type" value="code" />
            <input type="hidden" name="scope" value="" />
            <input type="hidden" name="resource" value="<resource_id>" />
            <noscript>
                <p>Script is disabled. Click Submit to continue</p>
                <input type="submit" value="Submit" />
            </noscript>
        </form>
        <script language="javascript">window.setTimeout('document.forms[0].submit()', 0);</script>
    </body>
</html>

Который сгенерировал мне правильный токен доступа!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...