使用 NGINX 的 Keycloak Oauth2 提供商保护我的 RESTful 服务
Protect my RESTful services by a Keycloak Oauth2 Provider Using NGINX
我们在某个 URI 上有一些 Restful 服务,我们想在网络上发布我们的服务以在我们的移动应用程序中使用它们(写在 java),
我们的服务位于无法同时处理太多请求的服务器上,为此使用了它的 proxy_pass 功能,
所以我在中间服务器上使用 Nginx 来控制对我们的 REST 服务器的访问,
现在我们想通过 Oauth2 使用密码或客户端凭证来保护我们的服务(因为我们的移动用户不应该登录到我们的服务器,我们不能向他们显示任何登录页面),
我设置了一个正在运行的 Keycloak 服务器,我可以为我的客户端获取令牌。我打算将我的 auth/token URI 提供给我们的移动开发人员,以便首先获取 Oauth2 令牌并在他们的请求中使用它。
问题是我不知道如何配置 Nginx 以在请求中使用提供的令牌授权传入的 REST 请求 header。
我应该配置 Keycloak 来处理请求并将授权请求转发给 NGINX 吗?
感谢您的帮助
经过一些尝试,我找到了这个解决方案:
1-nginx必须要加njs模块这个必须要先编译(所以在windows会很麻烦,我尝试了 mingw 并停在一个名为 expect 的依赖项上,它不是为 mingw 编写的,它浪费了我很多时间,实际上我将我们的 IAM 移到了 ubuntu 并编译了 njs 和里面的 nginx 几分钟就搞定了!)
2- Introspection是这里的重点,keycloak支持它,它的URI和token URI一样加上introspect,在header中使用Basic Authorization,在body中使用token
3- nginx 在添加njs模块后也支持自省,这将使nginx支持在配置文件中包含js代码,一个很好的例子是NGINX Demoes- Oauth2 Introspection OSS,只需复制配置文件和oauth2.js文件并完成。我在 nginx 配置文件的位置标记处添加了 api 指令,让调用者知道它受到保护。
4- 在 keycloak 中为 nginx 创建一个客户端来做内省操作,它应该处于机密模式并且应该为它启用 服务帐户。
5- nginx 应该转发(代理传递)auth/token 请求到 IAM,因此应该在配置文件中添加一个位置。
6- [for ubuntu] 我在 nginx 中遇到错误,告诉我它无法解析 localhost!并安装 Bind 9 为我解决了这个问题(这里又做了一次浪费时间的工作)。
7- 所以任何人想要使用我们的服务都应该先请求令牌,然后将其附加令牌的请求发送到 nginx,nginx 内省令牌并且如果令牌正常并且 {"active" : true} 已收到将请求转发给资源并将密码回复给请求者。
全部完成。
我们在某个 URI 上有一些 Restful 服务,我们想在网络上发布我们的服务以在我们的移动应用程序中使用它们(写在 java),
我们的服务位于无法同时处理太多请求的服务器上,为此使用了它的 proxy_pass 功能,
所以我在中间服务器上使用 Nginx 来控制对我们的 REST 服务器的访问,
现在我们想通过 Oauth2 使用密码或客户端凭证来保护我们的服务(因为我们的移动用户不应该登录到我们的服务器,我们不能向他们显示任何登录页面),
我设置了一个正在运行的 Keycloak 服务器,我可以为我的客户端获取令牌。我打算将我的 auth/token URI 提供给我们的移动开发人员,以便首先获取 Oauth2 令牌并在他们的请求中使用它。
问题是我不知道如何配置 Nginx 以在请求中使用提供的令牌授权传入的 REST 请求 header。
我应该配置 Keycloak 来处理请求并将授权请求转发给 NGINX 吗?
感谢您的帮助
经过一些尝试,我找到了这个解决方案:
1-nginx必须要加njs模块这个必须要先编译(所以在windows会很麻烦,我尝试了 mingw 并停在一个名为 expect 的依赖项上,它不是为 mingw 编写的,它浪费了我很多时间,实际上我将我们的 IAM 移到了 ubuntu 并编译了 njs 和里面的 nginx 几分钟就搞定了!)
2- Introspection是这里的重点,keycloak支持它,它的URI和token URI一样加上introspect,在header中使用Basic Authorization,在body中使用token
3- nginx 在添加njs模块后也支持自省,这将使nginx支持在配置文件中包含js代码,一个很好的例子是NGINX Demoes- Oauth2 Introspection OSS,只需复制配置文件和oauth2.js文件并完成。我在 nginx 配置文件的位置标记处添加了 api 指令,让调用者知道它受到保护。
4- 在 keycloak 中为 nginx 创建一个客户端来做内省操作,它应该处于机密模式并且应该为它启用 服务帐户。
5- nginx 应该转发(代理传递)auth/token 请求到 IAM,因此应该在配置文件中添加一个位置。
6- [for ubuntu] 我在 nginx 中遇到错误,告诉我它无法解析 localhost!并安装 Bind 9 为我解决了这个问题(这里又做了一次浪费时间的工作)。
7- 所以任何人想要使用我们的服务都应该先请求令牌,然后将其附加令牌的请求发送到 nginx,nginx 内省令牌并且如果令牌正常并且 {"active" : true} 已收到将请求转发给资源并将密码回复给请求者。
全部完成。