Ответ на этот вопрос можно получить из спецификации OAuth 2.0 (RFC6749) .Он определяет, когда грант ROPC подходит для
4.3.Предоставление учетных данных пароля владельца ресурса
Тип предоставления учетных данных пароля владельца ресурса подходит в случаях , когда владелец ресурса имеет доверительные отношения с клиентом , напримерв качестве операционной системы устройства или приложения с высокими привилегиями.Сервер авторизации должен проявлять особую осторожность при включении этого типа предоставления и разрешать его, только когда другие потоки не viabl.
Согласно вашему объяснению, у вас есть тесная связь с SPA и бэкэндом.Также у вас есть как сервер авторизации, так и сервер ресурсов.Это полностью приемлемая реализация .
Сервер авторизации может быть тем же сервером, что и сервер ресурсов , или отдельным объектом.
Так что теперь важно выяснить, почему вы используете OAuth 2.0 в вашем сценарии.
Если вы используете OAuth 2.0 для получения токенов, сохраняйте их, как определено спецификацией OAuth 2.0, тогда это совершенно непросто.,Но если вы делаете это, чтобы следовать тренду, подумайте дважды.
Реализация OAuth 2.0 имеет свою сложность.Вы должны поддерживать идентификационные данные пользователей, поддерживать токены и обновлять их.Вы создаете полный сервер авторизации самостоятельно.Но это также имеет некоторые преимущества.
Например, тот же сервер авторизации может использоваться для выдачи токена для будущих интеграций / вторичного приложения.IMO, использование OAuth 2.0 упрощает интеграцию, поскольку оно определяет протокол для выдачи токенов, их обновления и отзыва.! Но в таком сценарии интеграции может потребоваться использование другого гранта.Тем не менее, если ваш API авторизован на токене, вам нужно только беспокоиться о том, как новая интеграция / приложение получают токены.Это лучше, чем использовать сеансы с проверкой подлинности
Возвращаясь к вашим вопросам,
В: Действительно ли использование ROPC действительно опасно в этом сценарии?
Как объяснено, если между клиентом и сервером авторизации существуют корректные доверительные отношения, то это нормально.Но помните о сложности, если у вас есть сервер авторизации .
В: Каким был бы идеальный способ аутентификации и авторизации?
OAuth2.0 для авторизации .Вы получаете токены доступа и используете их для авторизации против ваших защищенных API.С помощью API вы делаете проверку токена, чтобы определить правильные уровни доступа / разрешения.
Если вы хотите аутентификацию , то вы должны использовать OpenID Connect .Это протокол, расширенный с OAuth 2.0.И позволяет вашему приложению аутентифицировать конечного пользователя на основе идентификатора токена.Вы можете использовать грант ROPC для получения токена ID.!
В: Или, может быть, OAuth2 полностью избыточен без участия третьей стороны?
Не обязательно.Это позволяет разрабатывать ваши API-интерфейсы современным стандартным способом.Кто знает, что ждет в будущем (опять сценарий интеграции).Следование протоколу позволяет это легко.
Только советы, внимательно следуйте спецификациям.Не изобретайте свой собственный протокол / адаптацию.Это усложняет обслуживание.