Контейнер хранилища Azure для хостинга приложений Angular - сбой обратного вызова и маршрутизации для проверки подлинности Azure
Я разработал приложение Angular 8 с NgxAdmin и разместил его как веб-приложение Azure. Он использует аутентификацию Azure AD Oauth2 с помощью NbAuthModule. Все нормально работает. Теперь я попытался разместить тот же SPA в учетной записи хранения Azure. Я добавил новый URL-адрес обратного вызова в регистрацию приложения для рекламы Azure и обновил redirectUri в методе NbOAuth2AuthStrategy.setup.
Когда я вызываю базовый URL-адрес статического приложения (https://<projectname>.z6.web.core.windows.net
), он правильно перенаправляет на https://<projectname>.z6.web.core.windows.net/auth/login?return=%2Fpages%2Fdashboard
. Я могу войти через Azure Ad. Затем URL-адрес изменится наhttps://<projectname>.z6.web.core.windows.net/auth/callback#access_token=eyJ0eXAiOiJKV1Q...
и должно быть перенаправление на ранее определенный URL-адрес возврата /pages/dashboard
. Но все, что я получаю, это 404 по ссылке обратного вызова.
Кроме того, если я попытаюсь позвонить, например, https://<projectname>.z6.web.core.windows.net/auth/login
напрямую, он возвращает 404 (если я сделаю то же самое с веб-приложением, отобразится компонент входа в систему).
Что я делаю неправильно? Внесены ли в мой код Angular дополнительные изменения, чтобы маршрутизация выполнялась в учетной записи хранения Azure?
2 ответа
Похоже, вы не используете HashLocationStrategy, поэтому ошибка 404, вероятно, связана с тем, что на веб-сервере нет папок / файлов вauth/callback
. У вас есть два варианта:
- Настройте свой веб-сервер для перенаправления на
{root}/index.html
когда он получает дополнительный маршрут, напримерauth/callback
- Используйте HashLocationStrategy, который добавит к вашим маршрутам префикс
#
, например:
https://<projectname>.z6.web.core.windows.net/#/auth/callback?access_token=eyJ0eXAiOiJKV1Q
https://<projectname>.z6.web.core.windows.net/#/auth/login?return=/#/pages/dashboard
Вот как можно включить стратегию определения местоположения хэша:
@NgModule({
imports: [
/* more imports here */
RouterModule.forRoot(routes, { useHash: true })
],
declarations: [
/* components here */
],
providers: [
/* services here */
],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Вам необходимо переписать URL-адреса, чтобы использовать маршруты при развертывании приложений angular на сервере. Я предполагаю, что вы используете сервер iis и добавляете следующее в web.config
<system.webServer>
<rewrite>
<rules>
<rule name="Angular Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
Или вы можете добавить стратегию Hash Location, которая дает # перед началом маршрута (например: https://sample.com/)
В app.module.ts
import {LocationStrategy, HashLocationStrategy} from '@angular/common';
После импорта добавьте в провайдеров следующую строку.
{provide: LocationStrategy, useClass: HashLocationStrategy}
пример:
providers: [AuthService,
AuthGuard,
FlxUiDataTable,
{provide: LocationStrategy, useClass: HashLocationStrategy}]
Надеюсь, это помогло. Спасибо