如何使用Google_auth_oauthlib流为登录用户获取所有Google组?

2024-04-19 13:36:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Google登录来验证/授权用户访问我的Flask web应用程序。这部分工作正常

我需要根据用户所属的组组织用户。在谷歌上使用admin,我创建了一个组,只有来自该组的用户才能使用该应用程序

问题是它只对我有效。可能是因为我是管理员/域所有者

其他所有人在获取令牌时都会出错

我正在使用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


Tags: 用户inpytokenauthadminresponseline
1条回答
网友
1楼 · 发布于 2024-04-19 13:36:53

权限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;
}

注意

在创建新脚本和函数之前,将脚本项目链接到GoogleDev项目是很重要的,否则它可能无法执行脚本函数

相关问题 更多 >