Какой из них более безопасный и почему?
Они оба безопасны, это зависит от среды, в которой вы их используете.
Я не вижу причины, по которой дополнительный шаг (код авторизации обмена для токена) добавляется в один рабочий процесс, когда сервер может напрямую выдать токен доступа.
Это просто. Ваш клиент не защищен. Давайте посмотрим на это подробнее.
Предположим, что вы разрабатываете приложение против Instagram API, поэтому вы регистрируете приложение Instagramи определяете, какое API'sвам нужно. Instagramпредоставит вам client_idиclient_secrect
На вашем веб-сайте вы создали ссылку, которая говорит. «Приходите и используйте мое приложение». При нажатии на это ваше веб-приложение должно сделать два звонка Instagram API.
Firstотправить запрос Instagram Authentication Serverс указанными ниже параметрами.
1. `response_type` with the value `code`
2. `client_id` you have get from `Instagram`
3. `redirect_uri` this is a url on your server which do the second call
4. `scope` a space delimited list of scopes
5. `state` with a CSRF token.
Вы не отправляетеclient_secret , Вы не можете доверять клиенту (Пользователь и / или его браузер, которые пытаются использовать ваше приложение). Клиент может увидеть url или java скрипт и client_secrectлегко найти его . Вот почему вам нужен еще один шаг.
Вы получаете codeи state. codeЗдесь temporaryи не сохраняется где - либо.
Затем вы secondзвоните Instagram API(с вашего сервера)
1. `grant_type` with the value of `authorization_code`
2. `client_id` with the client identifier
3. `client_secret` with the client secret
4. `redirect_uri` with the same redirect URI the user was redirect back to
5. `code` which we have already received.
Поскольку вызов сделан с нашего сервера, мы можем безопасно использовать client_secret(что показывает, как мы), codeчто показывает, что пользователь выдал client_idправо использовать ресурс.
В ответ мы будем иметь access_token