Я пишу приложение для Android, которое запрашивает разрешения на доступ к API календаря Google. Я делаю это в два этапа. Во-первых, пользователь входит в систему, и предоставляется только доступ к профилю. Позже, когда пользователь хочет использовать календарь, он предоставляет доступ к областям 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
Затем, когда пользователь выполняет определенную задачу в приложении, его снова просят новые разрешения, как описано в этом руководстве 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 теперь сообщает, что разрешения предоставлены, но доступ не работает с токеном доступа. Мне кажется, что я искал ответ по всему Интернету, поэтому очень надеюсь, что кто-нибудь сможет мне помочь.
Заранее спасибо.