我想使用OpenID Connect来保护我们移动应用的REST后端。简单来说,在通过REST后端(多个服务)获取敏感数据之前,应用程序用户需要进行身份验证(用户名/密码)。
进行初始身份验证后,他们应该收到一个 ID/access token,然后可以在其应用程序会话的其余时间内用于服务通信。获取此 ID token 非常重要,因为其中包含后端所需的信息。
作为实现此场景的身份提供程序,我想使用KeyCloak。但是,我不确定最佳的认证流程实现方式。我阅读了此和此 stackoverflow 帖子,但仍然不确定我的期望解决方案是否有效/安全/可接受。
根据我阅读关于 OpenID Connect 的资料,建议使用“3-legged 授权码流程”进行 OpenID Connect 认证流程,包括:
- 将用户重定向到身份提供程序(在我的情况下是 KeyCloak)的登录页面进行身份验证(例如登录表单)。
- 验证成功后,IP 将带有作为请求参数传递的 auth code 的用户重定向回应用程序。
- 然后,应用程序可以通过将此身份验证代码传递给“标准化”令牌终结点来从 IP 获取 ID/access token。
所有这些对于基于浏览器的 Web 应用程序听起来都很好,但在我们的应用程序中,我们想避免外部登录页面,而是拥有一个“本地”的应用内登录页面,以不太影响用户体验。同时,我们的应用程序具有一个保持“已登录状态”的功能。在这种情况下,用户只需登录一次,所有令牌都会在应用程序启动时由应用程序在后台获取。
根据我们的需求,我找到了这篇博客文章(链接)。它使用了基于2-legged资源所有者凭证流程的方法,可以让应用程序在不需要导航到KeyCloak登录页面的情况下完成自身认证并收集令牌。 我测试过了,这个解决方案似乎正好提供了我们需要的功能。而且,在我们的情况下,应用程序和KeyCloak(自行发布的OpenID提供者)仅在同一法律实体内部使用。 在我们的使用情况下,是否允许使用2-legged方法?如果不允许,为什么?这种方法是否会带来某些安全风险,而3-legged方法则没有呢?希望能得到你们的回复!
更新于16-10-2018:哇,伙计们,我发现了一个非常有趣的教程演示文稿 (链接),由Nate Barbettini制作,非常清晰地介绍了oauth、openid connect和各种身份验证流程,推荐大家在深入学习授权/身份验证的复杂领域之前先查看这个演示文稿。
祝好, Kim 来自荷兰