Создайте другой авторизатор JWT в Auth0 и прикрепите разрешения на основе разрешенных ролей - PullRequest
0 голосов
/ 26 марта 2020

В моем клиенте Auth0 есть три типа пользователей:

  1. Обычный пользователь (без роли)
  2. Пользователь модератора (ему назначена роль "Мод")
  3. Пользователь-администратор (ему назначена роль «Администратор»)

Я создал API в Auth0 и подключил его к конечным точкам через JWT-авторизатор в новом AWS API-интерфейсе HTTP-шлюза API.

Там Это логика бизнеса c, что некоторые конечные точки разрешают только обычным пользователям и администраторам, а некоторые разрешают Mod и Admin. Например:

  1. Конечная точка 1: разрешить обычный пользователь и администратор
  2. Конечная точка 2: разрешить мод и администратор
  3. Конечная точка 3: разрешить только мод

В настоящее время автор разрешает любому пользователю в базе данных пользователя в Auth0, и я проверяю личность пользователя в приложении через несколько API управления Auth0:

  1. /userInfo, чтобы убедиться, что токен совпадает :user_id.
  2. /oauth/token для получения токена доступа API управления Auth0.
  3. /api/v2/users/:user_id для получения профиля пользователя.
  4. /api/v2/users/:user_id/roles для получения Роль.

Я считаю, что должен быть лучший способ для проверки личности. Можно ли создать несколько авторизаторов с другой ролью / областью полномочий (например, разрешить обычному пользователю и администратору) и соответственно подключить к соответствующей конечной точке?

1 Ответ

0 голосов
/ 28 марта 2020

Я понял, что есть claims объект в event.requestContext.authorizer.claims от Lambda в соответствии с AWS API Gateway Do c.

  1. Поэтому дополнительные /userInfo вызов не нужен.
  2. Я добавил 2 Правила Auth0 , чтобы объединить роль пользователя с user.app_metadata и объектом claims.

Код пример для # 2:

function assignRoleToAppMetadata (user, context, callback) {
  const ManagementClient = require('auth0@2.19.0').ManagementClient
  const management = new ManagementClient({
    domain: '{YOUR_ACCOUNT}.auth0.com',
    clientId: '{YOUR_NON_INTERACTIVE_CLIENT_ID}',
    clientSecret: '{YOUR_NON_INTERACTIVE_CLIENT_SECRET}'
  })
  const params = { id: user.user_id }
  management.getUserRoles(params)
    .then(roles => {
      user.app_metadata = user.app_metadata || {}
      user.app_metadata.roles = roles
      return auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
    })
    .then(() => callback(null, user, context))
    .catch(err => {
      console.error(err.message)
      callback(null, user, context)
    })
}

Кроме того, следующее правило прикрепило информацию о роли к /userInfo:

function(user, context, callback) {
  const namespace = 'https://{YOUR_ACCOUNT}.auth0.com/'
  context.idToken[namespace + 'roles'] = user.app_metadata.roles
  callback(null, user, context)
}
...