【发布时间】:2016-11-10 09:21:37
【问题描述】:
我正在尝试找到一种方法来处理设置 Angular2 Typescript 路由(使用 3.0.0-alpha.8 路由器),该路由将处理以哈希片段开头的路由。
我正在开发的应用程序通过带有 oauth2 的 rails 后端处理所有外部登录(我无法控制)。将用户重定向到外部登录页面工作正常,但是当重定向 url 时,总是某种形式的http://localhost:4200#access_token=TOKEN(其中 TOKEN 是一系列数字和字母)被发送回来,但我不知道如何设置一个路由可以处理# 符号,因此我可以捕获它并重定向到相应的组件。
在以前的 Angular1 应用程序中,ui-router 能够在以下路线中使用:
.state('accessToken', {
url: '/access_token=:token',
controller: 'LoginController',
params: { token: null }
})
这在接受返回的重定向 url 时没有问题,然后会将所有内容传递给 LoginController 以在前端处理其余的身份验证/令牌业务。
然而,这个应用程序是 Angular2 和 Typescript,并且路由器查询参数似乎不太灵活,我在实施类似的解决方案时遇到了麻烦。我一直基于文档中的this section,但所有示例都在构建其他东西,例如/heroes,然后再进入查询参数的复杂部分,例如/heroes/:id。我也搜索了 stackoverflow,但找不到任何适用于 Angular2 和 Typescript 以及当前路由器的东西。
这是我当前(不工作)的解决方案:
import { provideRouter, RouterConfig } from '@angular/router';
import { HomeComponent } from './components/home/home.component';
import { TestComponent } from './components/test/test.component';
export const appRoutes: RouterConfig = [
{
path: '',
component: HomeComponent,
terminal: true
},
{
path: 'access_token',
component: TestComponent
}
];
export const APP_ROUTER_PROVIDERS = [
provideRouter(appRoutes)
];
如果我将发回的重定向 url 修改为类似http://localhost:4200/access_token=TOKEN 的内容(纯粹是为了测试目的),它可以正常工作。不幸的是,我实际上无法控制现实生活中重定向 url 的格式,我无法想出一个解决方案来处理它以哈希片段而不是 / 开头的事实,然后是我的查询参数。我能找到的所有带有复杂符号或字符的路由示例都以/ 开头。
我尝试将上面的解决方案修改为:access_token,但这不起作用,并将其列为基本路由下的子路由,如下所示:
{
path: '',
component: HomeComponent,
terminal: true,
children: [
{ path: 'access_token', component: TestComponent },
]
}
导致以下控制台错误:
platform-browser.umd.js:2312 EXCEPTION: Error: Uncaught (in promise): Error: Cannot match any routes: ''
我觉得绝对必须有一个干净的解决方案来解决这个问题,特别是因为如此多的 API 通过这样的重定向 url 处理它们的身份验证,但无论我如何挖掘文档,我似乎都找不到它。任何有关如何实现这一点的建议将不胜感激。
【问题讨论】:
标签: angular oauth-2.0 angular2-routing access-token angular2-router3