Как получить все группы Google для вошедшего в систему пользователя с помощью потока google_auth_oauthlib? - PullRequest
0 голосов
/ 06 августа 2020

Я использую Google Sign-in для аутентификации / авторизации пользователей для доступа к моему Flask веб-приложению. Эта часть работает нормально.

Мне нужно организовать пользователей по группам, к которым они принадлежат. Используя admin в Google, я создал группу, и только пользователи из этой группы могут использовать приложение.

Проблема в том, что это работает только для меня. Вероятно, потому что я администратор / владелец домена.

Все остальные получают ошибку при получении токена.

Я использую google_auth_oauthlib.flow.

Я использую следующие области:

"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/admin.directory.group.readonly",
"openid"

Когда кто-то за пределами этой группы пытается получить доступ, в журнале отображается следующая ошибка.

When getting token: (invalid_grant) Bad Request
Traceback (most recent call last):
  File "/tmp/tmpfhwmhvrg/__main__/licsrv/admin/admin.py", line 150, in view_cb_google
    f.fetch_token(authorization_response=authorization_response)
  File "/tmp/tmpfhwmhvrg/pip36/google_auth_oauthlib/google_auth_oauthlib/flow.py", line 241, in fetch_token
    self.client_config['token_uri'], **kwargs)
  File "/tmp/tmpfhwmhvrg/pip36/requests_oauthlib/requests_oauthlib/oauth2_session.py", line 244, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "/tmp/tmpfhwmhvrg/pip36/oauthlib/oauthlib/oauth2/rfc6749/clients/base.py", line 411, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "/tmp/tmpfhwmhvrg/pip36/oauthlib/oauthlib/oauth2/rfc6749/parameters.py", line 379, in parse_token_response
    validate_token_parameters(params)
  File "/tmp/tmpfhwmhvrg/pip36/oauthlib/oauthlib/oauth2/rfc6749/parameters.py", line 386, in validate_token_parameters
    raise_from_error(params.get('error'), params)
  File "/tmp/tmpfhwmhvrg/pip36/oauthlib/oauthlib/oauth2/rfc6749/errors.py", line 415, in raise_from_error
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.InvalidGrantError: (invalid_grant) Bad Request

1 Ответ

0 голосов
/ 07 сентября 2020

Разрешение https://www.googleapis.com/auth/admin.directory.group.readonly недоступно для пользователей без прав администратора.

Решением было написать сценарий приложений, который будет выполняться с доступом к контексту пользователя, и проверять, находится ли пользователь в группе или имеет ли какие-либо разрешения в группе.

Разрешение, указанное выше, было заменено на разрешение https://www.googleapis.com/auth/groups, и этого было достаточно для выполнения скрипта приложений.

Пример скрипта приложений приведен ниже, и это только часть скрипта, используемого в проекте.

function authorizeUser(userEmail) {
  var group = GroupsApp.getGroupByEmail("%PUT YOUR GROUP EMAIL HERE%");
  var inGroup = false;
  var users = group.getUsers();
  for (var i = 0; i < users.length; i++) {
    var user = users[i];
    inGroup = user.getEmail() == userEmail;
    if (inGroup) {
      break;
    }
  }
  Logger.log("inGroup: " + inGroup);
  return inGroup;
}

ПРИМЕЧАНИЕ

Важно связать проект скриптов с проектом Google dev перед созданием нового скрипта и функций, в противном случае функция скрипта может быть недоступна.

...