Azure App Service インスタンスで実行されている Node.js アプリケーションから認証したい Azure Active Directory テナントがあります。これを行うために、passportjs と Passport-azure-ad を使用しています。
ローカルではすべて正常に動作します。Azure AD テナントで認証でき、正しくマイ ページに戻ります。ただし、Azure では次のエラーで失敗します。
authentication failed due to: In collectInfoFromReq: invalid state received in the request
ローカル テストと Azure で同じテナントを使用しているため、私の構成は (redirectUrl を除いて) まったく同じですが、それでも失敗します。適切な応答 URL を設定すると、認証がアプリケーションに返されます。
これが私の設定です:
{
identityMetadata: `https://login.microsoftonline.com/${tenantId}/.well-known/openid-configuration`,
clientID: `${clientId}`,
responseType: 'id_token',
responseMode: 'form_post',
redirectUrl: 'https://localhost:3000/auth/oidc/return',
allowHttpForRedirectUrl: false,
scope: [ 'openid' ],
isB2C: false,
passReqToCallback: true,
loggingLevel: 'info'
}
OIDCStrategy を使用しています。
私の認証ミドルウェア:
passport.authenticate('azuread-openidconnect', {
response: res,
failureRedirect: '/auth/error',
customState: '/'
});
authorize
要求と返された応答のエンコードされた状態を比較しましたが、ローカルでも Azure でも同じように異なりますが、不満を言っているのは Azure だけです。状態の違いの例:
Azure:
Request state: CUSTOMEwAuZcY7VypgbKQlwlUHwyO18lnzaYGt%20
Response state: CUSTOMEwAuZcY7VypgbKQlwlUHwyO18lnzaYGt
localhost:
Request state: CUSTOMTAYOz2pBQt332oKkJDGqRKs_wAo90Pny%2F
Response state: CUSTOMTAYOz2pBQt332oKkJDGqRKs_wAo90Pny/
また、customState を完全に削除しようとしましたが、それでも失敗します。
ここで何が起こっているか知っている人はいますか?構成が間違っていますか?
編集:これは、passport-azure-ad の問題ではないようです。まだわかりませんが、一部のデバッグで、アプリへのログイン リクエストに set-cookie ヘッダーがないことが明らかになりました。セッションは作成されますが、Cookie が設定されていないため、返された応答は状態を含むセッション情報を検索して比較することができません。その結果、セッションからデータを取得できないため、無効な状態が報告されます。