首页 > 解决方案 > 身份验证后出现 404 错误(Springboot + Angular + Okta)

问题描述

我有一个使用 OKTA OIDC 进行身份验证的 Springboot+Angular 应用程序,该应用程序在我的本地主机上运行良好。对于测试服务器,它通过 Apache。我还没有配置 Apache 设置,也不知道它是如何完成的。我的本地主机上的任何请求,例如 http://localhost:4200/home 都会被转换为测试服务器上的https://testserver.com/app/appname/home 。我的 app-routing.module.ts 是

const routes: Routes = [
 { path: 'home', canActivate: [OktaAuthGuard], component: HomeComponent },
 { path: 'user/:id', component: UserComponent },
 { path: 'callback', component: OktaCallbackComponent },
 { path: '**', redirectTo: 'home', pathMatch: 'full'},
];

环境.ts

export const environment = {
    production: false,
    appUrl: 'http://localhost:8080/',
    issuer: 'https://dev-XXXXXXXX.okta.com/oauth2/default',
    clientId: 'XXXXXXXXXXXXXXX', 
    redirecturi: '/callback'
};

环境.test.ts

export const environment = {
    production: false,
    appUrl: 'https://testserver.com/services/appname/',
    issuer: 'https://dev-XXXXXXXX.okta.com/oauth2/default',
    clientId: 'XXXXXXXXXXXXXXX', 
    redirecturi: '/app/appname/callback'
};

我在 OKTA 控制台中提到了两个登录重定向 URI,它们与本地和测试服务器匹配为

Sign-in redirect URIs:    https://testserver.com/app/appname/callback
                          http://localhost:4200/callback

后端和前端都是独立构建和部署的。当我调用https://testserver.com/app/appname/#时,页面被重定向到 OKTA 登录页面。登录成功并打印 OKTA 系统日志

OAuth2 authorization code request success

但随后返回 404。

我在互联网上看到过用户发布的其他类似问题,但似乎没有一个解决方案对我有用。

我添加了 ReroutingConfig.java 类,如下所示:

@Configuration
public class ReroutingConfig implements WebMvcConfigurer {
    private static final Logger logger = LoggerFactory.getLogger(ReroutingConfig.class);

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        System.out.println("ReroutingConfig");
        logger.info("ReroutingConfig");
        registry.addResourceHandler("/callback").addResourceLocations("/", "classpath:/static/index.html");

        try {
            registry.addResourceHandler("/callback")
                    .addResourceLocations("/", "classpath:/static/")
                    .resourceChain(true)
                    .addResolver(new PathResourceResolver() {
                        @Override
                        protected Resource getResource(String resourcePath, Resource location) throws IOException {
                            logger.info("ReroutingConfig getResource");
                            Resource requestedResource = location.createRelative(resourcePath);
                            System.out.println("requestedResource: " + requestedResource.toString());
                            if (requestedResource.exists() && requestedResource.isReadable()) {
                                return requestedResource;
                            } else {
                                return new ClassPathResource("/static/index.html");
                            }
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

但是,它没有帮助。请提供任何可以提供的建议。谢谢!

标签: angularspring-bootapacheokta

解决方案


推荐阅读