因为用户体验。不要因为你想自定义你的登录页在自己的应用上就使用这种类型。因为有其他出于安全角度的考虑。通常情况下,我们使用google或者ms的应用的时候,是直接保存应用页面并不是登录页面。
如果我还不能说服你如果你还是想用这种granttype,请至少考虑以下的几点
加固token endpoint
因为ROPC需要直接访问token endpoint(获取token),攻击者会特别关注这个地址,所以,你需要实现一些类似请求拒绝,防止恶意尝试的策略。
理想状况下token endpoint一般不应该被这种事情所打扰,所以,默认的OAuth或者OpenID Connect Provider都不会去实现这种功能。
使用ROPC和SPA
SPA作为一种常见的客户端的程序,一般不保存secret,所以少了很大一部分的安全保护。如果你要在客户端保存secret,这是一种妥协策略。
ROPC本身是允许refresh token的,所以需要在server端禁用offline_access,不让SPA来刷新token。每次都要获取新的token。
最后的一些想法我只有在两种情况会同意使用ROPC。
在不需要浏览器的情况下,比如apple tv。
需要把一个2000年之前的老应用迁移过来。但其实我也曾经在一个vb.net的webform集成了IdentityServer,所以,我可能也不是很建议你使用。
最后说两点。
如果你的应用是基于浏览器的客户端应用,试试 Implicit。
如果你的是原生应用,试试Authorization Code。