使用Google Contacts API 3.0版和NodeJS'Passport同步联系人

时间:2014-02-05 00:42:03

标签: node.js oauth-2.0 google-api sync passport.js

我正在使用护照,并希望使用Google Contacts API version 3.0将Google通讯录与我的应用程序同步(这会突然变得有用10倍)。

有人这样做过吗?如果是这样,你有一些示例代码吗?是否甚至可以使用护照身份验证来使其全部正常工作?

2 个答案:

答案 0 :(得分:17)

这有两个部分,授权,然后是实际请求。

它基本上是使用OAuth2协议,您可以将客户端重定向到带有范围的google url(您的范围中必须至少有https://www.google.com/m8/feeds才能读取和写入联系人)和您的客户端ID / secret(通过registering your app获取它们。然后,Google会使用网址上的访问令牌将用户重定向回来。

您不需要自己执行此操作,因为有不同的模块已经执行此操作:

  • passport-google-oauth

    这很容易,假设你已经在使用护照,这可能就是你想要的。它由passportjs的作者撰写。只需按照其中的示例操作OAuth 2.0策略即可。请注意,在调用passport.authenticate('google', ...)时需要添加正确的范围。该模块获取令牌后,将获取用户配置文件,因此您必须拥有以下3个范围之一:

    passport.authenticate('google', { scope: [ // One of the next three `auth` scopes are needed.
        'https://www.googleapis.com/auth/userinfo.profile',
        'https://www.googleapis.com/auth/userinfo.email',
        'https://www.googleapis.com/auth/plus.login',
        'https://www.google.com/m8/feeds'
    ] }),
    
  • googleapis

    这个模块由谷歌正式支持并由谷歌员工创建。您可以使用它进行身份验证,但遗憾的是它不支持包含谷歌联系人的gData。您可以查看示例以了解如何获取令牌。您只需要使用此模块的m8/feeds范围,如果您不想获取用户配置文件,则无需其他范围。

  • gdata-js

    这是一个非流行的非维护模块,但它比前两个模块更轻量级。它可能需要一点点抛光。我建议也阅读理解api权利的来源。

获得令牌后,您可以选择稍微更轻松的部分,发出请求并获取数据。

如果您阅读docs,实际上非常简单。例如,要获取所有联系人(几乎全部,它是分页的),您需要向此URL发出GET请求:

https://www.google.com/m8/feeds/contacts/default/full?alt=json&oauth_token=THE_ACCESS_TOKEN

同样,有很多模块可以帮助你。

  • google-contacts
  • node-gdata
  • gdata-js阅读来源以了解它的api。实际上很简单:

    var client = require('gdata-js')(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET);
    client.setToken({ access_token: accessToken, refresh_token: refreshToken });
    client.getFeed('https://www.google.com/m8/feeds/contacts/default/full', function (err, result) { ... });
    

答案 1 :(得分:2)

Google的NodeJS官方API不支持Contacts API,仅支持People API。

如果您已经将official googleapis library用于Contacts API,则可以通过创建身份验证客户端后向Contacts API发送请求来将其用于其他目的。

鉴于您已经具有用户的访问令牌(例如,如果您是使用Passport生成的,则代码如下:

const {google} = require("googleapis");
const authObj = new google.auth.OAuth2({
    access_type: 'offline',
    clientId: process.env.GOOGLE_ID,
    clientSecret: process.env.GOOGLE_SECRET,
});

在访问令牌过期之前自动刷新访问令牌

authObj.on('tokens', (tokens) => {
    const access_token = tokens.access_token
    if (tokens.refresh_token){
        this.myTokens.refreshToken = tokens.refresh_token
        // save refresh token in the database if it exists
    }
        this.myTokens.accessToken = tokens.access_token       
        // save new access token (tokens.access_token)
}
authObj.setCredentials({
    access_token:this.myTokens.accessToken,
    refresh_token:this.myTokens.refreshToken,
});

向Contacts API发出请求(尽管googleapis中未正式记录该请求,但Google使用Gaxios向其API发出请求,因此请注意,他们将来可能会更改删除/更改请求调用,而不会对其进行记录)< / p>

authObj.request({
    headers:{
        "GData-Version":3.0
    },
    params:{
        "alt":"json",
        //"q":"OPTIONAL SEARCH QUERY",
        //"startindex":0
        "orderby":"lastmodified",
        "sortorder":"descending",
    },
    url: "https://www.google.com/m8/feeds/contacts/default/full"
}).then( response => {
    console.log(response); // extracted contacts
});