如何制作带有 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 模块在文档中提到了 bouncebounce_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。