4D NetKit:nonce属性によるセキュアなOpenID認証

最新の認証フローを使用する場合、セキュリティが最も重要です。開発者はしばしば、Google やMicrosoft のような信頼できるIDプロバイダーと認証を統合する必要があります。そこでOpenID Connect(OIDC)の出番です。

OIDC はOAuth 2.0 の上に構築された認証レイヤーです。これにより、アプリケーションはユーザーの身元を確認し、基本的なプロフィール情報を安全な方法で取得することができます。cs.NetKit.OAuth2Provider クラスの最新の機能強化を始めとして、4D 21では、id_token などの新しいトークン属性とともに、nonce パラメータをサポートすることで、OpenID Connect との連携がより簡単になりました。

標準的なOAuth 2.0 のスコープをリクエストすると、access_token を受け取ります。これはAPI にアクセスするためのものですが、ユーザーが誰であるかはわかりません。ユーザーを特定するには、openid スコープを含める必要があります。これにより OpenID Connect レイヤーがアクティブになり、 ID プロバイダに id_token を返させるようにすることができます。

スコープを追加することで、id_token に含まれる情報を充実させることができます:

  • openid → 必須。OpenID Connect をアクティブにし、id_token を提供します。
  • profile → オプション。名前、ニックネーム、画像などのプロフィール情報を返します。
  • email → オプション。ユーザのメールアドレスを格納します。

nonce パラメータは OpenID Connect リクエストに固有のものです。これは、クライアントのセッションと返された ID トークンを関連付けることで、リプレイ攻撃に対する防御に役立ちます。

  • あくまでオプションですが、セキュリティ性向上のために強く推奨されます。
  • この値は、認証リクエストから ID Token にそのまま渡されます。

ID_Tokenとは何か?

id_token はトークン・オブジェクトのプロパティで、openid スコープが要求されたときに返されます。JWT 形式のユーザーID 情報が含まれています。テキストとしてエンコードされているので、JWT の内容を読むには逆シリアル化(デシリアライズ)する必要があります。これを行うには、Netkit に含まれる JWT クラスを使用します。

var $provider:={}
$provider.name:="Microsoft"
$provider.permission:="signedIn"
$provider.clientId:="xxxx"
$provider.redirectURI:="http://127.0.0.1:80/authorize/"
$provider.scope:="openid profile email" // identity + profile インフォをリクエスト
$provider.nonce:="randomNonce456" // オプションの nonce 値

var $oauth:=cs.NetKit.OAuth2Provider.new($provider)
var $token:=$oauth.getToken()

// id_token にアクセス
If ($token.token.id_token#Null)

  // cs.NetKit.JWT クラスを使用して JWT 結果をデシリアライズ
  var $openID:=cs.NetKit.JWT.new().decode($token.token.id_token)
  
  If ($openID.payload.nonce=$param.nonce)
     ALERT("Hello "+$openID.payload.name)
  End if 

End if 

//$openID={ 
//   header: {
//      typ: "JWT";
//      alg: "RS256";
//      kid: "HS23b7Do..."
//   };
//   payload: {
//      aud: "b6822251-7...";     // the clientId (your application).
//      iss: "https://login.microsoftonline.com/06dc191b-7348-4b66-b0d9-806cb7d9455b/v2.0";
//      iat: 1758537433;          // the time when the token was issued.
//      nbf: 1758537433;          // the earliest time when the token is considered valid.
//      exp: 1758541333;          // the token expiration time.
//      email: "your.name@outlook.com";
//      name: "Your Name";       
//      nonce: "randomNonce456";  // the value sent in the request to protect against replay attacks (if used).
//      oid: "064fd139-65...";    // the unique identifier of the user’s account in the identity provider’s directory
//      preferred_username: "your.name@outlook.com";
//      rh: "1.AV8AGxncBkhz...";  // refresh token handle
//      sid: "008cb789-7...";     // session ID
//      sub: "6RcYjA-CqS...";     // the unique identifier of the user
//      tid: "06dc191b-73...";    // identifies the tenant (organization)
//      uti: "sS7qSOW0...";       // unique token identifier
//      ver: "2.0"
//   };
//   signature": "gy4AwVunCf_NbeUP..."
//}

まとめ

nonceid_token のサポートの導入により、4D はOpenID Connect の統合を簡素化します。適切なスコープをリクエストし、id_token をデコードすることで、アプリケーションは信頼できるID 情報にアクセスしながら、ユーザーを安全に認証することができます。

Fabrice Mainguené
- Product Owner -Fabrice Mainguenéは、2016年11月に4D Programチームに参加しました。プロダクトオーナーとして、彼はユーザーストーリーを書き、それを機能仕様に変換する役割を担っています。CNAMでコンピュータサイエンスの学士号を取得した後、FabriceはWindev開発者として小さなソフトウェア出版社に入社しました。その後、彼は産業および貿易分野のさまざまな企業で、Windev および Web 開発者として、また新機能の技術アドバイザーとして働きました。