首页 > 解决方案 > 如何在后端 API 中验证 AzureAD accessToken

问题描述

我只是想知道我们如何在我的例子中验证后端 API 中的天蓝色广告访问令牌,即 Django 休息框架。

考虑一下我有一个单页应用程序或一个本机应用程序和一个完全独立的后端 API(django rest 框架)。在我的情况下,如果我的单页应用程序/本机应用程序想要从后端 API 访问某些数据,并且为了访问 API,用户应该登录后端 API。

所以我的方法是利用 MSAL 库从 SPA/本机应用程序获取访问令牌,然后一旦获取令牌,将该令牌传递给后端 API,对其进行验证,从图形 API 获取用户信息。如果用户存在于数据库中,则登录用户并传递所需的信息。如果用户信息不存在,则创建用户,登录并从 API 传递信息。

所以我的问题是,当我将访问令牌传递给我的后端 api 时,如何验证用户/SPA/本机应用程序传递给后端 API 的令牌是否是有效令牌?

是否只是我们需要使用用户/SPA/native 传递的 accessToken 对图形 API 端点进行 API 调用,如果它能够使用 accessToken 获取用户数据,那么令牌是有效的,或者如果失败,那么 accessToken 是无效的.

这是验证令牌的一般方法还是有更好的方法?请帮忙

标签: reactjsdjangodjango-rest-frameworkazure-active-directorymsal

解决方案


我已经解决了类似的问题。我没有找到如何直接验证访问令牌,但您可以在后端使用您在 MSAL 客户端获得的令牌调用图形 API。

Node.js 示例:

class Microsoft {

  get baseUrl() {
    return 'https://graph.microsoft.com/v1.0'
  }

  async getUserProfile(accessToken) {
    const response = await got(`${this.baseUrl}/me`, {
      headers: {
        'x-li-format': 'json',
        Authorization: `Bearer ${accessToken}`,
      },
      json: true,
    })
    return response.body
  }
  
  // `acessToken` - passed from client
  async authorize(accessToken) {
    try {
      const userProfile = await this.getUserProfile(accessToken)
      const email = userProfile.userPrincipalName

      // Note: not every MS account has email, so additional validation may be required
      const user = await db.users.findOne({ email })

      if (user) {
        // login logic
      } else {
        // create user logic
      }
    } catch (error) {
      // If request to graph API fails we know that token wrong or not enough permissions. `error` object may be additionally parsed to get relevant error message. See https://docs.microsoft.com/en-us/graph/errors 
      throw new Error('401 (Unauthorized)')
    }
  }
}

推荐阅读