我有一个移动应用,我想从我的服务器上在用户的Google日历上添加事件。我已经在iO上添加了同意流程,并且从响应中获得了idToken。我也可以在客户端上使用accessToken
获得getTokens
。但是,我无法使用它们来在服务器上获取适当的刷新令牌,因此我可以在稍后阶段调用Calendar API。对于Web应用程序,它需要一个客户端密码。 ios客户端没有密码,当我使用Web客户端ID和密码时,我得到insufficientPermissions:权限不足:请求的身份验证范围不足。。
为了澄清,我的步骤是:
idToken
idToken
发送到服务器idToken
获取服务器上的刷新令牌(这是崩溃的地方)这是我的ios React Native代码:
signInWithGoogle() {
GoogleSignin.configure({scopes: ['https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/calendar.events']});
GoogleSignin.signIn()
.then(result => {
// idToken
console.log(result);
GoogleSignin.getTokens()
.then(tokens => {
//this gets me an accessToken
console.log(tokens);
})
}).catch(error => {
console.log('google auth error: ', error);
});
}
以及我的服务器端代码:
secrets = Google::APIClient::ClientSecrets.new({
"web" => {
"refresh_token" => ENV['GOOGLE_REFRESH_TOKEN'],
"client_id" => ENV["GOOGLE_CLIENT_ID"],
"client_secret" => ENV["GOOGLE_CLIENT_SECRET"]
}
})
auth_code = idToken_from_client
auth_client = secrets.to_authorization
auth_client.update!(scope: 'https://www.googleapis.com/auth/calendar.events')
auth_client.code = auth_code
auth_client.fetch_access_token!
我知道服务器代码没有意义,因为我已经有了访问令牌,但是我需要刷新令牌。只要用户使用应用程序并且访问令牌过期,我就需要为其创建事件。这是他们推荐的在服务器端auth docs中获取刷新令牌的方法:https://developers.google.com/identity/protocols/oauth2/web-server#exchange-authorization-code
感谢您的帮助!
答案似乎是使用auth流程来使用Web客户端ID和密码打开installed apps来打开系统浏览器窗口。 Google登录客户端不提供@DalmTo指出的刷新令牌。我将用代码片段更新此答案,并在完成实现并知道其有效后将其作为答案。