Действительно, предварительно зарегистрированный URI перенаправления является единственным механизмом защиты в этом случае общедоступного клиента при использовании так называемого типа неявного предоставления. Злоумышленник может обмануть пользователя при запуске потока, но не получит выданный токен на URL-адресе перенаправления, которым он управляет. Это похоже на обман пользователя при запуске любого другого потока входа в систему.
Поскольку злоумышленник не получает токен (он все еще доставляется по назначенному URI перенаправления, контролируемому клиентом), он не может получить доступ к вашим API, даже если он может убедить пользователя войти в систему.
Когда злоумышленник контролирует DNS, все становится более опасным, но это касается и многих вещей вне OAuth 2.0. В целом: доставка токенов в приложение в браузере будет страдать от этого типа уязвимости независимо от используемого протокола.
Переключение на учетные данные с паролем владельца ресурса имеет много недостатков, в том числе один, когда злоумышленник может представить приложение, похожее на ваше, для получения имени пользователя / пароля (что также блокирует переход от многофакторной аутентификации в качестве других типов предоставления). позволит вам).
В итоге: защита от этого есть, хотя и не суперсильная.
FWIW: последние передовые практики OAuth 2.0 предполагают, что токены больше не должны напрямую доставляться в URI перенаправления, а вместо этого используется промежуточный краткий одноразовый код авторизации использования, чтобы SPA мог получать свои токены в вызове XHR непосредственно от конечной точки токена.