[Google API OAuth 2.0获得移动设备上的用户权限,在服务器端API上使用

问题描述 投票:0回答:1

我有一个移动应用,我想从我的服务器上在用户的Google日历上添加事件。我已经在iO上添加了同意流程,并且从响应中获得了idToken。我也可以在客户端上使用accessToken获得getTokens。但是,我无法使用它们来在服务器上获取适当的刷新令牌,因此我可以在稍后阶段调用Calendar API。对于Web应用程序,它需要一个客户端密码。 ios客户端没有密码,当我使用Web客户端ID和密码时,我得到insufficientPermissions:权限不足:请求的身份验证范围不足。

为了澄清,我的步骤是:

  1. 获得同意并通过电话拨打idToken
  2. idToken发送到服务器
  3. 使用idToken获取服务器上的刷新令牌(这是崩溃的地方
  4. 使用刷新令牌在用户日历上创建事件

这是我的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

感谢您的帮助!

ruby-on-rails google-api google-calendar-api google-oauth2
1个回答
0
投票

答案似乎是使用auth流程来使用Web客户端ID和密码打开installed apps来打开系统浏览器窗口。 Google登录客户端不提供@DalmTo指出的刷新令牌。我将用代码片段更新此答案,并在完成实现并知道其有效后将其作为答案。

© www.soinside.com 2019 - 2024. All rights reserved.