首页 > 解决方案 > NodeJS:用于服务器端应用程序的 Google 登录

问题描述

按照本文档,我成功地为服务器端应用程序执行 Google 登录,并可以在服务器端使用 Python 访问用户的 GoogleCalendar。我没有用 NodeJS 做到这一点。

简而言之-使用Python,我使用了auth_code从浏览器发送的信息并获得了这样的凭据:

from oauth2client import client

credentials = client.credentials_from_clientsecrets_and_code(
    CLIENT_SECRET_FILE,
    ['https://www.googleapis.com/auth/drive.appdata', 'profile', 'email'],
    auth_code)

然后我可以在 DB 中存储以下值:

gc_credentials_json = credentials.to_json()

并生成凭据(是的,它在需要时单独使用 refresh_token):

client.Credentials.new_from_json(gc_credentials_json)

所以我想用 NodeJS 做同样的事情:

  1. CLIENT_SECRET_FILE使用 just :scopesauth_code(就像我使用 Python 一样)轻松生成凭据

  2. 使用以前的凭据值接收凭据,而不分析访问令牌是否已过期 - 我更喜欢现成的(经过社区测试的)解决方案

先感谢您!

标签: node.jsgoogle-api

解决方案


我已经使用google-auth-library包实现了它。

这是检索 gcClient 的函数:

const performAuth = async () => {
    const tokens = await parseTokenFromDB();
    const auth = new OAuth2Client(
        downloadedCredentialsJson.web.client_id,
        downloadedCredentialsJson.web.client_secret
    );
    auth.on('tokens', async (newTokens) => {
        updateDBWithNewTokens(newTokens);
    });
    await auth.setCredentials(tokens);
    const gcClient = google.calendar({version: 'v3', auth});
    return gcClient;
};

这是parseTokenFromCurrentDB函数的模板,只是为了给出其输出的概念:

const parseTokenFromCurrentDB = async () => {
    // Put here your code to retrieve from DB the values below 
    return {
        access_token,
        token_type,
        refresh_token,
        expiry_date,
    };
};

所以使用这个实现可以得到gcClient

const gcClient = await gc.getGcClient(org);

并使用它的方法,例如:

const gcInfo = await gc.getInfo(gcClient);
const events = await gc.getEvents(gcClient, calcPeriodInGcFormat());

推荐阅读