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