簡體   English   中英

使用 Passport.js 的訪問令牌的 Azure AD 無效簽名

[英]Azure AD Invalid Signature of Access Token using Passport.js

我正在嘗試使用 Passport-azure-ad 策略使用 Azure AD B2B 為我的 NodeJS/VueJS 應用程序設置身份驗證。 我使用授權碼流來獲取 access_token 和 id_token。 當我將 access_token 傳遞給 Passport-azure-ad 策略時,問題就出現了。 我收到一條錯誤消息,指出令牌的簽名無效(jwt.io 顯示相同)。 如果我使用 id_token 那么一切正常。 但是我不想使用 id_token,因為我想實現靜默刷新,而我只能使用 access_token 來做到這一點。

這是我的設置:

  • 我有一個 VueJS 應用程序(使用 Node.js 作為后端)並且我想使用 AAD B2B 作為登錄
  • 在前端,我首先執行此重定向:
let url = 'https://login.microsoftonline.com/'+TENANT_ID+'/oauth2/v2.0/authorize?'+
    'client_id='+CLIENT_ID+
    '&response_type=code'+
    '&scope=openid offline_access'+
    '&redirect_uri='+window.location.origin+
    '&state='+encodeURIComponent(generateRandomString())+
    '&nonce='+nonce;
  • 然后我將代碼發送到我的后端,以使用此請求將其交換為令牌:
let data = {
    client_id: CLIENT_ID,
    client_secret: CLIENT_SECRET,
    grant_type: 'authorization_code',
    redirect_uri: window.location.origin,
    code: code
  }
let response = await axios.post(`/${process.env.TENANT}/oauth2/v2.0/token`, data)
  • 然后我將令牌保存在前端的會話存儲中,並將其作為授權標頭與每個請求一起發送。

這是我的 BearerStrategy 的配置:

let options = {
    identityMetadata: "https://login.microsoftonline.com/"+envVars.TENANT+"/v2.0/.well-known/openid-configuration",
    clientID: envVars.CLIENT_ID,
    passReqToCallback: false,
    audience: envVars.CLIENT_ID,
    validateIssuer: true,
    issuer: 'https://sts.windows.net/'+envVars.TENANT+'/',
    loggingLevel: 'error',
}
var bearerStrategy = new OIDCBearerStrategy(options,
  function(token, done) {
    console.log(token)
    if (!token.oid) {
      return done(new Error('oid is not found in token'));
    }
    else {
      return done(null, token.unique_name, token);
    }
  }
);

passport.use(bearerStrategy);

我認為問題是出於某種原因,我取回了 v1 令牌而不是 v2。 我嘗試在應用程序注冊清單中設置"accessTokenAcceptedVersion": 2但它不起作用。

我究竟做錯了什么?

這是隱藏了一些信息的解碼令牌:

HEADER:ALGORITHM & TOKEN TYPE
{
  "typ": "JWT",
  "nonce": "1BaxlG05CpKz_zLXaJjZ0-nyYqLpMkktzvL9WiOEL74",
  "alg": "RS256",
  "x5t": "kg2LYs2T0CTjIfj4rt6JIynen38",
  "kid": "kg2LYs2T0CTjIfj4rt6JIynen38"
}

PAYLOAD:DATA
{
  "aud": "00000003-0000-0000-c000-000000000000",
  "iss": "https://sts.windows.net/[tenant_id]/",
  "iat": 1601568985,
  "nbf": 1601568985,
  "exp": 1601572885,
  "acct": 0,
  "acr": "1",
  "aio": "ASQA2/8RAAAAq7Z5bMg6AIJJ25iq7RI34DjbdRD9C6vnTlL3ZeilylQ=",
  "amr": [
    "pwd"
  ],
  "app_displayname": "[app_displayname]",
  "appid": "[appid]",
  "appidacr": "1",
  "family_name": "[family_name]",
  "given_name": "[given_name]",
  "idtyp": "user",
  "ipaddr": "[ipaddr]",
  "name": "[name]",
  "oid": "[oid]",
  "platf": "5",
  "puid": "10033FFFAFA83EAE",
  "rh": "0.ATAAdcJAG5J6AkqwgY-6rF6WssXSwci23txClbKekzYO8PwwAE8.",
  "scp": "User.Read profile openid email",
  "sub": "44PNYdl91SJrrrj4F25e1hXFyj3uTt-1ko6bUyT_Gq8",
  "tenant_region_scope": "EU",
  "tid": "[tenant_id]",
  "unique_name": "[email_address]",
  "upn": "[email_address]",
  "uti": "DNAFrnHtrU6wprPVywDNAA",
  "ver": "1.0",
  "wids": [
    "b79fbf4d-3ef9-4689-8143-76b194e85509"
  ],
  "xms_st": {
    "sub": "xpu87pTRk0UTZGgL9MGwrwTtZXP7qn7Aw-byR3_N_fU"
  },
  "xms_tcdt": 1504270371
}

更新:結果我得到了一個不能用於我自己的 API 的 MS Graph API 令牌。 所以我不得不為我的應用公開一個 API 並將其添加到 AAD 中的權限中。 對於這種情況,這是一個非常好的教程-> https://authguidance.com/2017/12/01/azure-ad-spa-code-sample/

根據您提供的信息,我們請求訪問令牌以調用 Microsoft Graph。 如果是這樣,我們不需要驗證 Microsoft 圖形簽名。 因為 MsGraph 認識到了提高用戶安全性的機會。 他們通過在 jwt 標頭中放入一個“nonce”來實現這一點。 JWS 用隨機數的 SHA2 簽名,在 JWS 序列化之前替換nonce 要驗證此令牌,需要將nonce替換為標頭中nonce的 SHA2。 現在這可以改變,因為沒有公共合同。 因此,在調用 Microsoft Graph 時,您應該將訪問令牌視為不透明的。 有關更多詳細信息,請參閱此處此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM