我正在使用护照,并希望使用Google Contacts API version 3.0将Google通讯录与我的应用程序同步(这会突然变得有用10倍)。
有人这样做过吗?如果是这样,你有一些示例代码吗?是否甚至可以使用护照身份验证来使其全部正常工作?
答案 0 :(得分:17)
这有两个部分,授权,然后是实际请求。
它基本上是使用OAuth2协议,您可以将客户端重定向到带有范围的google url(您的范围中必须至少有https://www.google.com/m8/feeds
才能读取和写入联系人)和您的客户端ID / secret(通过registering your app获取它们。然后,Google会使用网址上的访问令牌将用户重定向回来。
您不需要自己执行此操作,因为有不同的模块已经执行此操作:
这很容易,假设你已经在使用护照,这可能就是你想要的。它由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' ] }),
这个模块由谷歌正式支持并由谷歌员工创建。您可以使用它进行身份验证,但遗憾的是它不支持包含谷歌联系人的gData。您可以查看示例以了解如何获取令牌。您只需要使用此模块的m8/feeds
范围,如果您不想获取用户配置文件,则无需其他范围。
这是一个非流行的非维护模块,但它比前两个模块更轻量级。它可能需要一点点抛光。我建议也阅读理解api权利的来源。
获得令牌后,您可以选择稍微更轻松的部分,发出请求并获取数据。
如果您阅读docs,实际上非常简单。例如,要获取所有联系人(几乎全部,它是分页的),您需要向此URL发出GET请求:
https://www.google.com/m8/feeds/contacts/default/full?alt=json&oauth_token=THE_ACCESS_TOKEN
同样,有很多模块可以帮助你。
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
});