如何制作带有 CAS 身份验证的 Angular 5 + Node 应用程序?
How to make an Angular 5 + Node app with CAS authentication?
我目前正在尝试构建一个需要用户通过 CAS(中央身份验证服务)进行身份验证才能使用的应用程序。我在前端使用 Angular 5,在后端使用 Node.js。
为了在服务器端对用户进行身份验证,我使用了一个名为 'r-cas-authentication' 的模块,它会在用户通过身份验证时创建一个快速会话。事实上,我不知道如何在 Angular 端检查用户是否已通过身份验证,否则如何在 CAS 身份验证页面上重定向他。
你知道我怎么做到的吗?
谢谢!
你不需要在 angular
端处理这个问题。只需让 Node 服务器始终将未经身份验证的用户重定向到登录页面即可。浏览器设置 session headers,您的节点服务器将看到没有身份验证并发送重定向。 r-cas-authentication
模块在文档中提到了 bounce
和 bounce_redirect
选项,这将进一步简化流程。
您的节点实例将为登录页面提供服务。:
app.get('/login', (req, res) => res.sendFile('path/to/login.html'));
此外,您的资产(前端脚本、css、图像等)(通常)免费拥有:
app.get('/assets', express.static(pathToStaticDirectory));
此外,您有身份验证端点:
app.get( '/authenticate', cas.bounce_redirect );
接下来,它需要为 Angular 应用提供服务。但是,它需要一个 cas session 在这里。我们以 '/home'
为目标,但它可以是另一条路径,例如“/”或您拥有的任何路径。
app.get('/home', cas.bounce, express.static(pathToAngularAppDirectory);
最后,您可能会有想要保护的 REST API 个端点:
app.use('/api', cas.block, appRoutes);
现在,这就是发生的事情。请求来自浏览器。它命中 '/home'
路线。由于浏览器是首次访问,因此未设置身份验证 headers。它将命中 cas.bounce()
块并重定向到 /login
路由。一旦到达那里,就会得到服务 login.html*.
你在那里输入你的登录数据并点击登录按钮 - 页面被提交,cas
中间件验证用户 - 设置 session 数据和所有浏览器。浏览器会随身携带这些(注意我说的是浏览器,而不是 Angular)。 它还会将用户重定向回“/home”页面。
现在您的浏览器 有 session 信息,因此它可以通过路线,获得 Angular 文件,应用程序正常启动.一切都很酷。
Angular.
你可能还想处理一个案例
假设您的 session 已过期。并且浏览器处于打开状态或其他状态。用户重新访问该页面 - 太棒了,cas.bounce
会将用户重定向回登录表单。
但是,如果用户只是在您的应用中单击 "refresh" 会怎么样?然后 Angular 的 HttpClient
收到 401 响应(根据节点模块文档)。你可以有一个简单的 http interceptor 来执行 window.location.reload()
或类似的操作(基本上是整个页面重新加载,而不是 client-side 导航),并且在页面重新加载时,你的应用程序会陷入 cas.bounce
因为它正在尝试重新加载 /home unauthenticated。
我目前正在尝试构建一个需要用户通过 CAS(中央身份验证服务)进行身份验证才能使用的应用程序。我在前端使用 Angular 5,在后端使用 Node.js。
为了在服务器端对用户进行身份验证,我使用了一个名为 'r-cas-authentication' 的模块,它会在用户通过身份验证时创建一个快速会话。事实上,我不知道如何在 Angular 端检查用户是否已通过身份验证,否则如何在 CAS 身份验证页面上重定向他。
你知道我怎么做到的吗? 谢谢!
你不需要在 angular
端处理这个问题。只需让 Node 服务器始终将未经身份验证的用户重定向到登录页面即可。浏览器设置 session headers,您的节点服务器将看到没有身份验证并发送重定向。 r-cas-authentication
模块在文档中提到了 bounce
和 bounce_redirect
选项,这将进一步简化流程。
您的节点实例将为登录页面提供服务。:
app.get('/login', (req, res) => res.sendFile('path/to/login.html'));
此外,您的资产(前端脚本、css、图像等)(通常)免费拥有:
app.get('/assets', express.static(pathToStaticDirectory));
此外,您有身份验证端点:
app.get( '/authenticate', cas.bounce_redirect );
接下来,它需要为 Angular 应用提供服务。但是,它需要一个 cas session 在这里。我们以 '/home'
为目标,但它可以是另一条路径,例如“/”或您拥有的任何路径。
app.get('/home', cas.bounce, express.static(pathToAngularAppDirectory);
最后,您可能会有想要保护的 REST API 个端点:
app.use('/api', cas.block, appRoutes);
现在,这就是发生的事情。请求来自浏览器。它命中 '/home'
路线。由于浏览器是首次访问,因此未设置身份验证 headers。它将命中 cas.bounce()
块并重定向到 /login
路由。一旦到达那里,就会得到服务 login.html*.
你在那里输入你的登录数据并点击登录按钮 - 页面被提交,cas
中间件验证用户 - 设置 session 数据和所有浏览器。浏览器会随身携带这些(注意我说的是浏览器,而不是 Angular)。 它还会将用户重定向回“/home”页面。
现在您的浏览器 有 session 信息,因此它可以通过路线,获得 Angular 文件,应用程序正常启动.一切都很酷。
Angular.
你可能还想处理一个案例假设您的 session 已过期。并且浏览器处于打开状态或其他状态。用户重新访问该页面 - 太棒了,cas.bounce
会将用户重定向回登录表单。
但是,如果用户只是在您的应用中单击 "refresh" 会怎么样?然后 Angular 的 HttpClient
收到 401 响应(根据节点模块文档)。你可以有一个简单的 http interceptor 来执行 window.location.reload()
或类似的操作(基本上是整个页面重新加载,而不是 client-side 导航),并且在页面重新加载时,你的应用程序会陷入 cas.bounce
因为它正在尝试重新加载 /home unauthenticated。