分散アーキテクチャにおける認証と認可のレイヤーを実装するためには、通常、OAuth 2.0、OpenID Connect、または企業のIdentity Provider(IdP)などの集中管理型のアイデンティティシステムを利用します。認証(本人確認)は外部プロバイダーを介して行われ、その後の結果(通常はトークン)は、すべてのサービスでの認可(権限の付与)に使用されます。
通常、メカニズムは次のように機能します:
PythonとPyJWTライブラリを使用したJWTトークンの検証コードの例:
import jwt from jwt.exceptions import InvalidTokenError def verify_jwt(token, public_key): try: payload = jwt.decode(token, public_key, algorithms=["RS256"]) return payload except InvalidTokenError: return None # 使用例 user_info = verify_jwt(received_token, public_key) if user_info: # アクセス許可済み pass else: # アクセス禁止 pass
重要な特徴:
質問: JWTトークン内にユーザーの権限に関するすべての情報を格納する必要がありますか?
必ずしも必要ではありません。トークンのサイズを最小限に抑えるために、通常はユーザーIDと最小限の権限/役割のみを含めます。詳細な権限は、サーバーへの追加リクエストやプロファイルクレームの読み込みによって取得できます。
質問: リフレッシュトークンはすべての分散アーキテクチャに必須ですか?
いいえ、リフレッシュトークンは再認証なしで長期的なセッションが必要な場合にのみ必要です。 stateless APIでは、通常、短期間のaccess tokensのみが使用され、リフレッシュロジックはウェブまたはモバイルクライアントのみに実装されます。
質問: JWTのペイロードセクションは暗号化できますか?
JWT(RFC 7519)の標準では、ペイロードは署名されるだけで暗号化されません。暗号化には別の標準であるJWE(JSON Web Encryption)を使用します。そうしないと、トークンを持っている人は誰でもペイロードを読むことができます(例えば、jwt.ioを通じて):
import jwt jwt.decode(token, options={"verify_signature": False})