私が働いている会社は、長年にわたって「組織的に」成長した成功したSaaS製品を維持しています。既存の製品とデータを共有する一連の新製品でラインを拡大する予定です。これをサポートするために、ビジネスロジックを1つの場所(Webサービスレイヤー)に統合することを検討しています。WSレイヤーは次のユーザーによって使用されます。
また、独自の統合を作成するためにそれを使用できるお客様が使用できるAPIを作成したいと考えています。私たちは次の質問に苦労しています:
内部API(別名WSレイヤー)と外部APIが同じで、誰が何を実行できるかを制御するためのセキュリティと権限の設定があるか、または外部APIが内部APIを呼び出すだけの2つの別個のアプリケーションであるか他のアプリケーションと同じですか?これまでの議論では、それらを分離する方がより安全であるように思われますが、オーバーヘッドが追加されます。
他の人は同じような状況で何をしましたか?
自分のドッグフードを食べるのは常に良いことです。認証と承認のオーバーヘッドを考慮に入れても、1つのAPIは2つよりも保守が簡単です。
私は以前に(何度も)これに遭遇しました、そして私が優先してやったことは次のとおりです:
BLをWebサイトから外します。 WebサイトをAPIの利用者にします。 WebサイトをAPIの他のクライアントとして扱います。 API ISサービス。
Webサイトだけに特別なAPIメソッドが必要だと思ったら、もう一度考えてみてください。ガチョウにいいのなら、ガンダーにもいい。あなたが本当にウェブサイトのために本当に特別な機能を本当に必要としているなら、私が実際に見つけたのは「ユーザープロファイル」の違いであり、したがってこれはAPIがまだ「特別な」機能をサポートするはずの状況ですが、承認を介してそれらを制御します。
納得できませんか?
パラダイムをさらに一歩進めます...
電話アプリはバイトコードが実行されるプラットフォームで実行されており、アプリは電話内にあり、HTTP/JSON経由でAPIサービスを利用します
ウェブサイトは、HTML + Javascriptが実行されるプラットフォームで実行されるアプリであり、アプリはブラウザーに存在し、HTTP/JSONを介してAPIサービスを利用します
同じ同じ!
それをタブレット、TV、その他の電話プラットフォーム、プラグイン、サードパーティのアプリ、マッシュアップなどに拡張してください...
多くの異なるユーザーエクスペリエンスがすべて共通のAPIに接続されています。
アプリIS API。ウェブサイトは(多くの)クライアントの1つにすぎません)
私はAneurysm9に同意しますが、システムのすべての機能を公開したくない場合があります。この場合、2つのAPIを使用することをお勧めします... [〜#〜] but [〜#〜]このように選択した場合...すべての一般的な機能が同じであることを確認してくださいAPI、IE 2つの異なるコードセットではなく、一方が他方の拡張バージョンであること。
このようにして、公開APIをあまり変更せずに新しいものを公開して使用できるようにしながら、プライベートで機密性の高い実験的な作業を進めるための場所を確保しながら、自分で自分のものを使用できます。
1つのAPIを使用
RESTレイヤーとしてサービスAPIを実装している場合は、保護されているルートに認証を追加するだけです。
おそらく、「魔法」を使いすぎない開発フレームワークを使用したいと思うでしょう。大量のリバースエンジニアリングを行わなくても、ルートを直接定義できるもの。
Node.js/Express、python/pylons、python/google app engineなどのようなものを考えてください。
私は最近、これをREST/Datastore APIのGoogle App Engineに実装しましたが、もっと簡単だったとは思いません。コントローラはクラスとして実装され、それらの後続のHTTPリクエスト(つまり、GET/POST/PUT/DELETE)はそれらのクラスのメソッドとして実装されます。私は何とかベーシック認証をデコレータとして実装しました。これにより、リクエストに認証要件を追加するのが、@ basicAuthデコレータをアタッチするのと同じくらい簡単になりました。
このようにして、着信GETリクエストをパブリックにして、そのモデルの同じコントローラー上のPOST/PUT/DELETEリクエストに認証要件を追加できます。
RESTで話す方法を知っていると、RESTサポートはすでに本質的にこれまでのWebサーバーに組み込まれているため、人生はずっと簡単になります(つまり、HTTPは単なるREST = API)回線経由で大量のデータを送信する場合は、透過的なgzip圧縮を選択することもできます。