尽管已授予Google API访问令牌的保护范围,

时间:2019-01-23 14:28:40

标签: java android google-api google-calendar-api google-oauth

我正在编写一个Android应用程序,该应用程序请求访问Google日历API的权限。我分两个步骤进行操作。首先,用户登录并且仅授予配置文件访问权限。以后,当用户想要使用日历时,他授予对日历API范围的访问权限。

身份验证代码在登录时发送到我的后端服务器,以获取其访问令牌和刷新令牌。

在我的Google帐户中,我的应用程序也显示了访问所请求范围的权限,但是https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxxx告诉我access_token它仅具有以下范围: "scope": "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.profile"

因此顺序如下: 我这样登录

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                //.requestIdToken(Constants.CLIENT_ID)
                .requestServerAuthCode(Constants.CLIENT_ID)
                .requestEmail()
                .build();
gSignIn = GoogleSignIn.getClient(UserSingleton.getInstance().getContext(), gso);
Intent signInIntent = gSignIn.getSignInIntent();
startActivityForResult(signInIntent, 1);

这可以正常工作,我将身份验证代码发送到我的(node.js)后端服务器,并在其中进行如下处理:

const oauth2Client = new google.auth.OAuth2(
    process.env.CLIENT_ID,
    process.env.CLIENT_SECRET,
    ""
  );

  const { tokens } = await oauth2Client.getToken(authcode).catch((err) => {
    console.log(err.response.data);
    throw new Error(err);
  });
  oauth2Client.setCredentials(tokens);
  //store tokens away

然后,当用户在App中执行特定任务时,他再次被要求提供新权限,如google在本教程中所述:https://developers.google.com/identity/sign-in/android/additional-scopes

if(!GoogleSignIn.hasPermissions(account, 
    new Scope("https://www.googleapis.com/auth/calendar"),
    new Scope("https://www.googleapis.com/auth/calendar.readonly"),
    new Scope("https://www.googleapis.com/auth/calendar.events"),
    new Scope("https://www.googleapis.com/auth/calendar.events.readonly"))
  ){                       
 GoogleSignIn.requestPermissions((MainActivity)UserSingleton.getInstance().getContext(), 3, account,
    new Scope("https://www.googleapis.com/auth/calendar"),
    new Scope("https://www.googleapis.com/auth/calendar.readonly"),
    new Scope("https://www.googleapis.com/auth/calendar.events"),
    new Scope("https://www.googleapis.com/auth/calendar.events.readonly"));
}

我的Google帐户现在说已授予权限,但是访问不能与访问令牌一起使用。我觉得我已经在整个互联网上搜索了答案,所以我真的希望有人可以帮助我。 预先感谢。

0 个答案:

没有答案