Google 登录同意页面未针对我的应用程序请求的所有范围请求许可
Google Login consent page does not ask for permission for all scopes my application requests
我创建了一个小型 java 应用程序,可以下载并处理我家人设备上传到 Google 云端硬盘的所有照片。
但现在 Google 驱动器不再用于存储照片,所以我需要访问 Google 照片。
但是无论我做什么,我都无法通过 java API 访问。
现在我找到了问题所在。尽管我已经在 google dev 中更新了我的应用程序范围要求。控制台 (pic 1), google does NOT ask for permission for the Photo Library scopes at login (pic 2).
因此我无法访问照片库,但得到:
com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scopes.
at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:55) ~[gax-1.45.0.jar:1.45.0]
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:72) ~[gax-grpc-1.45.0.jar:1.45.0]
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:60) ~[gax-grpc-1.45.0.jar:1.45.0]
at com.google.api.gax.grpc.GrpcExceptionCallable$ExceptionTransformingFuture.onFailure(GrpcExceptionCallable.java:97) ~[gax-grpc-1.45.0.jar:1.45.0]
at com.google.api.core.ApiFutures.onFailure(ApiFutures.java:68) ~[api-common-1.8.1.jar:?]
at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1015) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1137) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:957) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.setException(AbstractFuture.java:748) ~[guava-28.0-jre.jar:?]
at io.grpc.stub.ClientCalls$GrpcFuture.setException(ClientCalls.java:492) ~[grpc-stub-1.10.1.jar:1.10.1]
at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:467) ~[grpc-stub-1.10.1.jar:1.10.1]
at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.internal.CensusStatsModule$StatsClientInterceptor.onClose(CensusStatsModule.java:700) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.internal.CensusTracingModule$TracingClientInterceptor.onClose(CensusTracingModule.java:399) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:500) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl.access0(ClientCallImpl.java:65) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:592) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access0(ClientCallImpl.java:508) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImplStreamClosed.runInContext(ClientCallImpl.java:632) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) ~[grpc-core-1.21.0.jar:1.21.0]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_212]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_212]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_212]
Suppressed: com.google.api.gax.rpc.AsyncTaskException: Asynchronous task failed
at com.google.api.gax.rpc.ApiExceptions.callAndTranslateApiException(ApiExceptions.java:57) ~[gax-1.45.0.jar:1.45.0]
at com.google.api.gax.rpc.UnaryCallable.call(UnaryCallable.java:112) ~[gax-1.45.0.jar:1.45.0]
at com.google.photos.library.v1.internal.InternalPhotosLibraryClient.listAlbums(InternalPhotosLibraryClient.java:913) ~[google-photos-library-client-1.3.0.jar:1.3.0]
at com.google.photos.library.v1.internal.InternalPhotosLibraryClient.listAlbums(InternalPhotosLibraryClient.java:891) ~[google-photos-library-client-1.3.0.jar:1.3.0]
at com.google.photos.library.v1.PhotosLibraryClient.listAlbums(PhotosLibraryClient.java:201) ~[google-photos-library-client-1.3.0.jar:1.3.0]
at dk.fafdifh.photo.manager.cron.PhotoSynchronizer.fetch(PhotoSynchronizer.java:208) ~[classes/:?]
at java.lang.Iterable.forEach(Iterable.java:75) [?:1.8.0_212]
at dk.fafdifh.photo.manager.cron.PhotoSynchronizer.fetch(PhotoSynchronizer.java:132) [classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_212]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_212]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_212]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_212]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) [spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_212]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [?:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [?:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_212]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_212]
Caused by: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scopes.
at io.grpc.Status.asRuntimeException(Status.java:533) ~[grpc-api-1.21.0.jar:1.21.0]
... 23 more
哦,顺便说一句 - 是的;我尝试从应用程序中删除所有凭据,撤销应用程序对我的帐户的访问权限并从头开始。无果。
我没有尝试在 google 开发控制台中创建一个全新的应用程序,但是...
我想通了!
同意页面中包含哪些范围并不取决于在开发中将哪些范围添加到应用程序。控制台授权页面。
它(当然,愚蠢!)由 GoogleAuthorizationCodeFlow 范围列表中列出的范围决定。
如此简单...
我创建了一个小型 java 应用程序,可以下载并处理我家人设备上传到 Google 云端硬盘的所有照片。
但现在 Google 驱动器不再用于存储照片,所以我需要访问 Google 照片。
但是无论我做什么,我都无法通过 java API 访问。
现在我找到了问题所在。尽管我已经在 google dev 中更新了我的应用程序范围要求。控制台 (pic 1), google does NOT ask for permission for the Photo Library scopes at login (pic 2).
因此我无法访问照片库,但得到:
com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scopes.
at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:55) ~[gax-1.45.0.jar:1.45.0]
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:72) ~[gax-grpc-1.45.0.jar:1.45.0]
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:60) ~[gax-grpc-1.45.0.jar:1.45.0]
at com.google.api.gax.grpc.GrpcExceptionCallable$ExceptionTransformingFuture.onFailure(GrpcExceptionCallable.java:97) ~[gax-grpc-1.45.0.jar:1.45.0]
at com.google.api.core.ApiFutures.onFailure(ApiFutures.java:68) ~[api-common-1.8.1.jar:?]
at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1015) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1137) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:957) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.setException(AbstractFuture.java:748) ~[guava-28.0-jre.jar:?]
at io.grpc.stub.ClientCalls$GrpcFuture.setException(ClientCalls.java:492) ~[grpc-stub-1.10.1.jar:1.10.1]
at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:467) ~[grpc-stub-1.10.1.jar:1.10.1]
at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.internal.CensusStatsModule$StatsClientInterceptor.onClose(CensusStatsModule.java:700) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) ~[grpc-api-1.21.0.jar:1.21.0]
at io.grpc.internal.CensusTracingModule$TracingClientInterceptor.onClose(CensusTracingModule.java:399) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:500) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl.access0(ClientCallImpl.java:65) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:592) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access0(ClientCallImpl.java:508) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImplStreamClosed.runInContext(ClientCallImpl.java:632) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[grpc-core-1.21.0.jar:1.21.0]
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) ~[grpc-core-1.21.0.jar:1.21.0]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_212]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_212]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_212]
Suppressed: com.google.api.gax.rpc.AsyncTaskException: Asynchronous task failed
at com.google.api.gax.rpc.ApiExceptions.callAndTranslateApiException(ApiExceptions.java:57) ~[gax-1.45.0.jar:1.45.0]
at com.google.api.gax.rpc.UnaryCallable.call(UnaryCallable.java:112) ~[gax-1.45.0.jar:1.45.0]
at com.google.photos.library.v1.internal.InternalPhotosLibraryClient.listAlbums(InternalPhotosLibraryClient.java:913) ~[google-photos-library-client-1.3.0.jar:1.3.0]
at com.google.photos.library.v1.internal.InternalPhotosLibraryClient.listAlbums(InternalPhotosLibraryClient.java:891) ~[google-photos-library-client-1.3.0.jar:1.3.0]
at com.google.photos.library.v1.PhotosLibraryClient.listAlbums(PhotosLibraryClient.java:201) ~[google-photos-library-client-1.3.0.jar:1.3.0]
at dk.fafdifh.photo.manager.cron.PhotoSynchronizer.fetch(PhotoSynchronizer.java:208) ~[classes/:?]
at java.lang.Iterable.forEach(Iterable.java:75) [?:1.8.0_212]
at dk.fafdifh.photo.manager.cron.PhotoSynchronizer.fetch(PhotoSynchronizer.java:132) [classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_212]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_212]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_212]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_212]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) [spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_212]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [?:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_212]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [?:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_212]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_212]
Caused by: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scopes.
at io.grpc.Status.asRuntimeException(Status.java:533) ~[grpc-api-1.21.0.jar:1.21.0]
... 23 more
哦,顺便说一句 - 是的;我尝试从应用程序中删除所有凭据,撤销应用程序对我的帐户的访问权限并从头开始。无果。
我没有尝试在 google 开发控制台中创建一个全新的应用程序,但是...
我想通了!
同意页面中包含哪些范围并不取决于在开发中将哪些范围添加到应用程序。控制台授权页面。
它(当然,愚蠢!)由 GoogleAuthorizationCodeFlow 范围列表中列出的范围决定。
如此简单...