在API上禁用Azure AD令牌

rjjhvcjd  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(142)

我使用Azure AD B2C登录React Native应用。此应用可以对CMS(Strapi)进行API调用。在返回响应之前,CMS必须检查发出请求的用户是否已登录。
应用程序中的登录部分工作正常,这是我登录后在应用程序中返回的数据:

  1. {
  2. "tokenType": "Bearer",
  3. "refreshToken": "...",
  4. "scope": "offline_access openid",
  5. "idToken": "...",
  6. "issuedAt": 1698310667
  7. }

字符串
然后,应用程序在报头x-activedirectory-token中发送idToken。
我不知道如何在CMS策略(中间件)中检查令牌的有效性。我尝试了@azure/msal-node包,但未能找到一种方法来检查令牌是否有效。
These Azure docs在主题上设置了一个IPv6-Passport中间件,但Strapi使用了不同的路由器(koa),在中间件中添加中间件似乎很奇怪。
首选的解决方案是像@azure/msal-node包,可以检查令牌,或一些Azure端点或类似的东西。
也许我忽略了一些东西,因为我几乎没有Azure AD的经验。也就是说,任何帮助都非常感谢,因为我已经在这个问题上停留了一段时间。

i1icjdpr

i1icjdpr1#

默认情况下,msal应该检查这个,但如果你正在寻找一个库来做这件事,看看here

i86rm4rw

i86rm4rw2#

感谢@juunas为我指明了正确的方向。我设法通过使用jwks-rsa和jsonwebtoken库获得了所需的行为。这是如何工作的代码示例(基于jsonwebtoken readme中的代码示例):

  1. import {
  2. verify as verifyJwt,
  3. type JwtHeader,
  4. type SigningKeyCallback,
  5. } from "jsonwebtoken";
  6. import jwksClient from "jwks-rsa";
  7. // Gets the cookie information from the discovery document
  8. const client = jwksClient({
  9. jwksUri: "https://.../discovery/v2.0/keys?p=b2c_1_signin",
  10. });
  11. function getPublicKey(header: JwtHeader, callback: SigningKeyCallback) {
  12. client.getSigningKey(header.kid, function (err, key) {
  13. let signingKey = key.getPublicKey();
  14. if (!signingKey && "rsaPublicKey" in key && key.rsaPublicKey) {
  15. signingKey = key.rsaPublicKey;
  16. }
  17. callback(null, signingKey);
  18. });
  19. }
  20. // Verify the token with the public key, constructed by the jwksClient
  21. verifyJwt(activeDirectoryToken, getPublicKey, {}, (err) => {
  22. if (err) {
  23. // Invalid token
  24. return;
  25. }
  26. // Valid token
  27. });

字符串

展开查看全部

相关问题