Gmail API Gmail NodeJs 客户端中的 userId 使用案例?

Gmail API userId use cases in Gmail NodeJs client?

如何在使用特殊值 'me' 的情况下使用 userId 属性?

据我了解,当您使用 'me' 时,就是您已通过最终用户身份验证的时候。

但是当您未通过最终用户身份验证时,您不能使用 'me' 也不能使用任何其他值,因为您没有执行给定请求的权限。

我想了解如何在不使用 userId 字段中的值 'me' 的情况下代表经过身份验证的用户在我的应用程序上执行操作?

使用 Gmail nodeJs 客户端的示例:

const googleClient = new google.auth.OAuth2(client_id, client_secret, redirect_uri);

async function getUnreadEmailsFrom(userID) {
let gmail = google.gmail({ version: 'v1', auth: googleClient });

/* Here on the line below, I'd like to use the email or ID of an already authenticated user in order to perform a given action.

But the only way I understand that I am able to perform any action is by loading the token of the user and saving it via 
googleClient.setCredentials(userToken)
and then using the special value 'me' inside the userId propery.
*/
let response = await gmail.users.messages.list({userId: 'me', q: 'is:unread', maxResults: 500 });

return response.data;
} 

简答:

userId 的唯一允许值是 me 和经过身份验证(或模拟)的用户电子邮件地址。

解释:

访问其他用户数据的唯一方法是grant domain-wide authority to a service account并使用它来模拟您要访问其数据的目标用户(该用户应该在同一域中)。

然而,目标用户电子邮件是在模拟时指定的(参见 Preparing to make an authorized API call),即在调用 API.

之前

稍后,当调用 API 时,特殊值 me 将对应于模拟用户,并且唯一接受的值将是 me 和模拟用户电子邮件。任何其他值都会导致错误(因为服务帐户将充当模拟用户,并且只能访问模拟用户的数据)。

因此,me 的唯一替代方法是经过身份验证的用户电子邮件地址,但您当然会得到相同的数据。

全域授权示例:

creds = service_account.Credentials.from_service_account_file('credentials.json', scopes=SCOPES)
creds = creds.with_subject('your_target_user@email.com')
service = build('gmail', 'v1', credentials=creds)
messages = service.users().messages().list(userId="me").execute()