質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

マイクロサービスでの認証認可情報の取り回し方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 155

BECK_

score 88

現在簡単なwebアプリケーションを作成してマイクロサービスの概念を勉強中です。

理解した事

  • サービス間は疎結合にしてWebAPIで通信する
  • 独立性や可用性の観点からサービス間を跨ぐ情報の共有は行わない(共有DBや共有メモリ等の利用はNG)
  • とは言えシステム全体ではステートフル的に振る舞う必要がある為、認証認可情報を持ち回る必要がある

出来た事

とりあえず、認証周りを切り出してマイクロサービス化してみました。
ログイン認証はレガシーな独自承認とgoogleのSSO承認まで出来ました。
いずれの認証方式でも汎用的にしたくJWTで管理しようと考えてます。

疑問

  • 認証までは出来たけど後続処理でid-tokenをどう持ち回る?

今までのモノリシックなシステムではCookieにセッションIDを保存しており、サーバーへのリクエスト時にCookieヘッダフィールドによしなにセットして自動的に送信される為、リクエスト時にはセッションIDを意識しなくてもを処理が継続出来ていました。

 要は、Cookie使用時の様に透過的にid-tokenの持ち回りを処理したいと考えていますが、 クライアントサイドはどの様に実装するのがベストプラクティスでしょうか? 

下記のいずれかの方法を採用すると、クライアント側ではid-tokenの存在を特に意識(処理)する事なくid-tokenを持ち回れる様な気がするが正しい実装か?

  • Cookieにid-tokenを保存し自動送信させる
  • queryStringにid-tokenをセットする
  • form内にhiddenで隠す

リクエスト時にhederにid-tokenをセットし送信するのが作法の様ですが、formサブミット時に自動的に送信される仕組みはないのか?

 Authorization: Bearer {access-token} 

参考にしたURL

https://systemdevs.hateblo.jp/entry/2018/05/15/164651

上記サイトからすると、既存のWEBアプリをマイグレーションする際に全POST処理をJavascriptで送信する様に処理を追加するしか方法は無いのでしょうか?

もしそうだとするとクライアント側にフレームワーク的な何かが無いと、クライアント側のコーディングに負債を抱える事になりそうな気がしています。

参考サイトでも参考書籍でもご教授頂ければ幸いです。
宜しくお願い致します。

補足

既存のモノリシックシステムから都度粒度を勘案して順次マイクロサービス化出来ないかな。。と考えております。
サーバーサイドのアーキテクチャも通常のLAMPスタックからスタートしており、フルスタックでの実装がイメージ出来ておりません。
現時点でサーバーサイドでURLを処理し交通整理するフロントエンドの仕組みが必要かどうかも判断出来ておりません。
本件を考慮するにあたり、アーキテクチャ設計も必須になりますでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • BECK_

    2019/08/16 18:07

    クローズしてしまって後にアレですが..

    >表示側が、「Web」「ネイティブアプリ(iOS, Android)」となるなら、
    >共通のロジックは極力サーバ側に寄せるほうが良いと思います。

    との事よく理解出来ます。

    その際、WebViewでの実装がモアベターとの理解で宜しかったでしょうか?
    僕がネイティブアプリの開発スキルが無いので一般論で結構ですが、上述の様なマルチデバイス実装の場合は皆様はどの様に実装されているのでしょうか。

    キャンセル

  • mokemokechicken

    2019/08/16 18:35

    (理解されているとは思いますが)アプリでWebViewでやるかは要件や予算次第になると思います。
    Hybridっぽいものや、完全にNativeのみの場合など色々あると思います。
    この辺は(UIの)品質にどの程度こだわるか、というところですね。

    私が所属していた会社では、NativeなViewで基本作って、一部だけWebViewというのは割と多い感じでした。この辺は、開発会社の得意不得意でも方針が変わる気がしますね。

    キャンセル

  • BECK_

    2019/08/17 00:55

    予算は内製なので多少調整は効くと思いますが
    たしかにUX含め品質に依存しそうですね。
    勉強になります。
    丁寧に有難う御座いました!

    キャンセル

回答 1

checkベストアンサー

+1

全体像が見えないと何が最適なのか、などは判断が難しいと思いますが、
単にTokenの取り回しのはなしだけを考えると以下のように思いました。
※ 全然ベストプラクティスとかは、わかりません...

対 HTML供給 Web Server

  • Cookieには session_id だけ入れて、サーバ側で session_id -> auto_token を持っておく。
  • 理由: シンプルだし安全確実
  • 補足: これが必要になるのは、HTML供給WebServerから 他のAPIサーバにTokenでアクセスすることが必要な場合になるだろう

対 他の API Server

  • HTML供給WebServerからTokenを取得して(JSに埋め込みか、TokenをAPIで取ってくる(ここはcookieで認証)かして)
  • Authorization Headerにtokenを入れて送信するのが良さそう
  • 理由: 意味的に自然?なんですかね。Headerだとサーバ側で検証ロジックがPlugin的に書きやすいですかね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/16 14:29

    セッションはサービスを跨げない(跨がない)との理解だったのでセッションを利用しない実装を模索しての投稿でしたが、なにかしらサーバー側で状態を保持し共有する仕組みが必要なようですね?

    キャンセル

  • 2019/08/16 15:52 編集

    おっしゃるとおり、セッションはサービスを跨がないイメージです。
    この場合、セッションを管理するのはHTMLを(ページを)出力するサーバだけで良いと思います。
    例えば、別途「メール/Push通知管理MicroService」みたいなのがあったとして、そういうところとはセッション(IDに関連付けられた情報)を共有しないです。

    逆に、HTMLを出力する(いわゆる普通のWeb)サーバは、セッションを持たないとさすがに成り立たないと思います。

    キャンセル

  • 2019/08/16 16:25

    なるほど理解出来ました。
    実装もイメージ出来ます。
    有難う御座います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る