2016-10-13 5 views
0

Reactアプリケーションでは、基本的にパスワードを非認証ユーザーにリセットしています。問題は、Ajaxを使ってそれを行うために、私はサービスURLを公開しています(これはセキュリティで保護されておらず、プロジェクトのその部分が他の会社に属しているので、これ以上作業することはできません)。レスキューアプリケーションで非認証ユーザーからWebサービスを非表示にするためのセキュアレイヤーを作成

実際のサービスをユーザーから隠すような、ある種のRESTサービスを作成するという私のアイデアは以前はありませんでした。私はそれを呼び出し、 "彼は"私に必要なデータを与える実際のサーバーを呼び出します。

しかし、この新しいサービスをセキュリティで保護して、私のアプリだけが使用できるようにする必要があります。これが良い方法であれば、認証されていないユーザーでこれをどのように実装できますか。そうしないと、この問題を解決するために何ができますか?

私は何らかのアイデアが公開されていますが、私はNode.jsを使用する予定でしたが、私はこの特定の問題に関しては経験がありません。

ご協力いただきありがとうございます。

+1

考え方があるが、私が見てきたベストプラクティスは、彼らは、パスワードのリセットがされていることを確認できるように、ユーザーに電子メールを送信することですパスワードを変更することができます。それ以上の確認なしにユーザ名に基づいてパスワードを変更することを許可しないでください。別のエンドポイントと通信するためにセキュリティ保護されていない制御可能なエンドポイントを作成すると、同じ状況になります。他の会社のサービスURLを公開しない目的でエンドポイントを作成している場合、これは良いアプローチになります。 – diaz994

+1

@diegoalmespすべてのサービスに対してSpringセキュリティを使用して基本認証を実装できます。 – Gautam

答えて

1

既存のサービスを変更することができず、安全でない環境にある場合は、正しい考え方です。 UIから呼び出されるRESTサービスを作成する方が良いですし、RESTサービスは既存のサービスを呼び出す必要があります。
ここで、ユーザーを認証する機能がない場合、そのRESTサービスをどのように安全にすることができるかわかりません。 RESTサービスを作成しても、ユーザーを認証するための手段がないと目的を解決できません。そのRESTサービスも公開され、あなたの目的を解決しません。
このサービスまたはログイン画面などを呼び出す前にセッションの作成や詳細のキャプチャなど、ユーザーを認証する機能がある場合は、他のサービスにアクセスする前にユーザーを確認する方法として役立ちます。溶液。

1

ユーザーを認証する必要がある場合は、ユーザーのみが電子メールにアクセスできると仮定して、電子メールを使用するのが最も現実的な方法です。 (これはまた最も安いものです)。

URLを生成するときは、注意が必要なときです。基本的には、一意であり、公開されておらず、特定のユーザーに関連付けられていることを確認する必要があります。それを行う一般的で最も単純な方法は、URLにトークンを追加することです。さて、トークン生成に関連するいくつかの暗号要件がありますが、私はこの機能的に独自のコードを作成しないようにアドバイスします。 1回使用トークンの例として、https://tools.ietf.org/html/rfc6750をチェックすることができます。

しかし、このスレッドでLiferayにタグを付けたので、UserLocalServiceを使用して電子メールを生成することを検討できます。

またはURLを生成するため、このコードからインスピレーションを得る:

 Date expirationDate = null; 

     if ((passwordPolicy != null) && 
      (passwordPolicy.getResetTicketMaxAge() > 0)) { 

      expirationDate = new Date(
       System.currentTimeMillis() + 
        (passwordPolicy.getResetTicketMaxAge() * 1000)); 
     } 

     Ticket ticket = ticketLocalService.addDistinctTicket(
      companyId, User.class.getName(), user.getUserId(), 
      TicketConstants.TYPE_PASSWORD, null, expirationDate, 
      serviceContext); 

     StringBundler sb = new StringBundler(6); 

     sb.append(serviceContext.getPortalURL()); 
     sb.append(serviceContext.getPathMain()); 
     sb.append("/portal/update_password?p_l_id="); 
     sb.append(serviceContext.getPlid()); 
     sb.append("&ticketKey="); 
     sb.append(ticket.getKey()); 

     passwordResetURL = sb.toString(); 
関連する問題