如何修改Google Directory API代码避免二次登录获取企业用户列表?
解决Google Directory API获取用户列表无需二次登录的方案
你当前的代码仅使用API_KEY初始化gapi客户端,只能访问公开数据,而Directory API属于私有企业数据,需要携带OAuth 2.0访问令牌且拥有对应权限才能调用。同时要复用已有的登录会话,避免二次登录,需从以下几个方面调整:
1. 调整Google登录按钮的权限范围
确保登录时请求Directory API的用户只读权限,这样登录成功后就能获取到具备对应权限的访问令牌。修改登录按钮的data-scope属性:
<div class="g-signin2" data-onsuccess="onSignIn" data-scope="openid email https://www.googleapis.com/auth/admin.directory.user.readonly"></div>
2. 修改前端代码复用登录后的访问令牌
登录成功后提取访问令牌,初始化gapi客户端时传入该令牌,无需重新登录即可调用API:
// 登录成功回调:提取并存储访问令牌 function onSignIn(googleUser) { const authResponse = googleUser.getAuthResponse(); const accessToken = authResponse.access_token; // 存储令牌用于页面刷新后复用 localStorage.setItem('google_access_token', accessToken); // 初始化gapi客户端并拉取用户列表 initializeGapiClient(accessToken); } // 初始化gapi客户端,传入访问令牌 async function initializeGapiClient(accessToken) { await gapi.client.init({ apiKey: API_KEY, discoveryDocs: [DISCOVERY_DOC], // 关键:传入已获取的访问令牌 access_token: accessToken, }); await listUsers(); } // 拉取用户列表并填充下拉框 async function listUsers() { let response; try { const request = { 'customer': 'my_customer', 'maxResults': 10, 'orderBy': 'email', }; response = await gapi.client.directory.users.list(request); } catch (err) { document.getElementById('content').innerText = err.message; return; } const users = response.result.users; // 填充下拉框逻辑 if (users?.length) { const userSelect = document.getElementById('user-select'); users.forEach(user => { const option = document.createElement('option'); option.value = user.id; option.textContent = user.primaryEmail; userSelect.appendChild(option); }); } else { document.getElementById('content').innerText = '未找到可用用户'; } } // 页面加载时检查是否已有登录令牌 document.addEventListener('DOMContentLoaded', () => { gapi.load('client', () => { const savedToken = localStorage.getItem('google_access_token'); if (savedToken) { initializeGapiClient(savedToken); } else { document.getElementById('content').innerText = '请先完成登录'; } }); });
3. 关键注意事项
- 确保你的Google Cloud项目已启用Admin SDK API;
- 登录用户必须是Google Workspace的管理员账号,或被授予了读取企业用户的权限;
- 访问令牌会过期(默认1小时),如果需要长期有效,可以在登录时设置
access_type=offline以获取refresh_token,用于自动刷新令牌; - 不要在前端暴露敏感凭证,确保令牌仅在已登录的管理员会话中使用。
内容的提问来源于stack exchange,提问作者blackstone
相关产品推荐
相关产品推荐

