2017-07-17 15 views
1

私はFOSUserBundle、FOSRestBundle、HWIOauthBundleのバックエンドフレームワークとしてSymfony3を使用しています。私はフロントエンドのフレームワークとしてNodeJSと共にAngular2も使用しています。Symfony3の認証されたユーザ(HWIOAuth)からAngular2でJWTトークンを取得

フロントエンドフレームワークは、LexikJWTAuthenticationBundleを使用してバックエンドフレームワークからデータを取得します。目的は、子クラスを持つマスタークラス "AbstractUser" を使用してユーザーを認証することです:

  • FacebookUser、GoogleUser、...(OAuth認証用)
  • NativeUser(ユーザー/パスワード認証用)

I首尾セットアップ認証メカニズムの一部:

  • ユーザー/パスワード認証:私はSymfony3 FRにAngular2フレームワークからのユーザーを認証する必要がありますamework。そのため、Symfony3はヘッダで使用されるトークンを返します。

しかし、私はAngular2フレームワークからのOAuthユーザーを認証しようとすると、私はsymfony3フレームワークにリダイレクトされ、認証プロセスの後、Symfony3は、ユーザーを認証し、それがAngular2フレームワークのページにユーザーを戻します。これは論理のようです。

しかし、問題はAngular2フレームワークが認証されたユーザーを認識しないことです。実際、ユーザーはSymfony3フレームワーク(Angular2ではなく)を使用してOAuthプロバイダを通じて認証されています。私はsymfony3で認証されたユーザのJWTトークンを返す必要がありますページhttp://symfony_framework/get_tokenを呼び出すしようとするとAngular2、でそう、私は見つけることのコード行:

$this->get('security.token_storage')->getToken(); 

戻り、この結果:

app.INFO: AnonymousToken(user="anon.", authenticated=true, roles="") 

私はこのページをhttp://symfony_framework/get_tokenと呼ぶと、私はこのページ(クッキーを使って)で認証されているので、JWTトークンを印刷するが、Angular2はクッキーがない(XHRリクエスト)。

解決策はありますか?可能であれば、私は安全なソリューションが必要です。私はこのアイデアについて考えた:

  • 認証後Angular2からSymfony3を使用してのOAuthプロバイダに、symfonyはAngular2ページにユーザーをリダイレクトしようとしたとき、それはまたAngular2フレームワークにJWTトークンを送信します(取得を使用してまたはPostメソッド)を使用して、次回RESTデータを取得します。しかし、どのユーザーも悪意のあるJWTトークンまたはAnglet2フレームワークに偽のJWTトークンを送信する可能性があるため、これが安全かどうかはわかりません。しかし、私はユーザー情報を取得しようとするとSymfony3コントローラでこのトークンを確認できます。しかし、これはすべて安全ですか?私はこのすべてのことで新しく、私は特にユーザーアカウント(Facebook、Google、...)で間違いをしてはいけません。
  • キャッシュ内のトークンを共有します(https://stackoverflow.com/a/39467076/8239292)。しかし、これは2つのウェブサイト(Angular2とSymfony3)の間で可能ですか?そしてこれも安全ですか?キャッシュは、トークンのような機密データを保存するためには使用されません。また、有効期限(トークンの妥当性よりも大きい場合)のために多くの問題が発生します。

他に解決策がある場合は、最適な解決策を教えてください。

おかげ

答えて

0

"の論理が、私はAngular2フレームワークからのOAuthユーザーを認証しようとした場合、私は本当に知りませんが、私はsymfony3フレームワークにリダイレクトされ、認証プロセスの後、Symfony3は、ユーザーを認証しますAngular2フレームワークのページにユーザーを戻します。

認証を処理するSymfony3サイトがあり、別のAngularサイトがフロントエンドビューを処理しているようです。 Symfony3にログインして、ユーザがセッションに保存されている可能性があります。しかしAngularは純粋なクライアントフレームワークです。 Symfony3からこの「セッション」を得ることができませんでした。したがって、Angularでは、あなたは認証されていません。

私は、RESTful APIを使用して認証を行っています。あなたが言ったように、Symfony3はバックエンドフレームワークであり、AngularのPOST API要求(http://symfony_api/authentication)を処理し、ユーザーを認証します。 FOSUserBundleとLexikJWTAuthenticationBundleは、Angularに対する応答として送信できるJWTトークンを生成します。 Angularサイトでは、セキュリティ戦略に基づいて、このトークンを異なるストレージに格納することができます。今度はAngularに「ログイン」しています。後でユーザー情報を取得する場合は、トークンをHTTPリクエストヘッダーに含める必要があります(http://symfony_api/get_user、{認証:ベアラMY_ACCESS_TOKEN})。 Symfony3では、トークンが有効かどうかをチェックする必要があります。

+0

ご返信ありがとうございます。はい、知っています。そして私がした作業の間、私はセッションを使用しませんでした。私はあなたが言ったように、NativeUserユーザーを認証するためにヘッダーにJWTトークンを使用しました(ログイン/パスワード認証)。しかし、他のタイプの認証(OAuth)に関しては、認証プロセス中にToken JWTを使用する方法を見つけられませんでした。確かに私はセッションを使用する必要はありません。 Angular2の匿名ユーザーの状況を説明するために、以前のセッションについて話しました。 OAuthで認証した後、新しいJWTトークンを生成する必要があります。 –

+0

したがって、これらのタイプの認証(OAuthまたはLogin/Password)の両方について、ユーザーはトークンを使用してSymfony3からRESTデータを取得するため、認証のタイプは後では問題ありません –

関連する問題