新しいコンポーネント ルーター ビットを備えた Angular 1.5 を使用してアプリを構築しようとしています。少し特殊なケースに遭遇したので、それを回避する方法があるかどうか疑問に思っています。
主なプレーヤー
- IdentityServer v2 : 現在、クライアントはこれを OAuth に使用しています。この問題の一部を引き起こします。これはレガシーであり、その使用法を制御することはできません。
- フロントエンド フレームワークとしてAngularJS 1.5 。
- ngComponentRouter と呼ばれる新しい angular routerは、今では信じられますか? 私たちは、このスタイルが Angular v1.5 と Angular v2 の間の橋渡しに役立つと考えており、移植も簡単でした。
- OAuth 暗黙的フローのラッパーとしてのoauth-ng ..
- 古いブラウザー: IE9+ をサポートする必要があるという意味で、Angular の HTML5 モードを使用できないことを意味します。
目標
次のような URL を取得したいと考えていますhttp://mysite/#!/auth/#auth_token=xyz123
(構造は制御下にありません。たとえば、2 番目のハッシュを削除できません)。
- 実際の認証コントローラーに入れる
- パラメータを介して、または を介して直接、auth_token 値を使用できるようにします
$location
。(現在、コントローラーに到達する前にスクラブされています)。
背景・問題点
クライアントには、IdentityServer v2 を使用している中央ログイン システムがあります。私が理解している限りでは、IdSrv v2 からトークンをリクエストする#auth_token=xyz123
と、リダイレクト URL に追加して応答します。あなたが持っていると思ったときに書き戻されたmy.com/login.html
ため、login.html#auth_token=xyz123
.
ただし、すでにハッシュを使用している Angular アプリでは、URL が最終的にmysite.com/#/auth#auth_token=xyz123
.
ご想像のとおり、これは Angular を怒らせます。これをコンポーネントルーターの下で機能させる方法をまだ見つけられていません。
古いルーターとの連携方法
oauth -ng docsに従って、html5 を有効にせずに古いルーターを使用していた場合は、次のようにします。
angular.module('app').config(function ($routeProvider) {
$routeProvider
.when('/access_token=:accessToken', {
template: '',
controller: function ($location, AccessToken) {
var hash = $location.path().substr(1);
AccessToken.setTokenFromString(hash);
$location.path('/');
$location.replace();
}
})
試したこと
- 同様の方法でコンポーネント ルートを定義します。コンポーネント ルーターで許可されていないように見える が
/access_token=:accessToken
含まれているため、これは機能しませんでした。=
- IdentityServer v2 で応答の形式を変更できるかどうかを確認します。それは可能ではないようです。応答は にハードコードされているよう
[URL we define]#auth_token=xyz123
です。 - 他のハッシュなどを使用して URL を偽造します。一般的に、悪い/一貫性のない動作が発生します。
私たちの選択肢は何だと思いますか
- キャッチオール / 見つからないコントローラーを使用します。ルートを まで通過させれば、
/**
からトークン値を取得できます$location
。しかし、それは一種のグロスです。私たちはそれを避けたいです。 - 完全な URL をコントローラに取得する方法を見つけます。ルートをキャプチャしてコントローラーに渡すことはできますが、その時点では URL を使用できません。
- 古いルーターまたは ui-router の使用に戻ります (この時点ではやりたくありません)。
私たちを正しい方向に向けることができるものは何でも大歓迎です!