我正在使用GoogleSignIn pod中的此代码从IOS应用程序请求访问用户数据
[GIDSignIn sharedInstance].uiDelegate = self;
[[GIDSignIn sharedInstance] setScopes:@[ ... ];
[[GIDSignIn sharedInstance] signInSilently];
然后,我在应用代理中接收访问令牌和刷新令牌,并将其发送到运行PHP并使用此google客户端库(https://github.com/googleapis/google-api-php-client)的服务器...第一个小时一切正常,访问令牌有效,允许我访问所有范围。然后一个小时后,访问令牌过期,我尝试使用此代码刷新它
$client = new Google_Client();
$client->setApplicationName(<app name>);
$client->setDeveloperKey(<google_oauth_developer_key>);
$client->setClientSecret(<google_oauth_client_secret>);
$client->setClientId(<google_oauth_client_id>);
$client->refreshToken("1/12ju3ZZim-r6co195lIVNNvzBq9x5G64GJCWkYsOQ18");
并且上面的“刷新令牌”函数返回此错误
=> [
"error" => "unauthorized_client",
"error_description" => "Unauthorized",
]
值得注意的是,应用程序名称、google\u oauth\u developer\u密钥、google\u oauth\u client\u secret和google\u oauth\u client\u id没有更改。它们与之前在访问令牌尚未过期时检索用户联系人、日历事件等的操作相同。
什么可能导致此错误?
好吧,我知道我做错了什么。我最初遵循这些指示https://developers.google.com/identity/sign-in/ios/sign-in假设您只需要在线访问,但实际上我需要离线访问作用域,所以我遵循以下说明https://developers.google.com/identity/sign-in/ios/offline-access现在就可以了。因此,不要让IOS应用程序像这样分别发送访问令牌和刷新令牌
- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
withError:(NSError *)error {
if (!error) {
NSString *accessToken = user.authentication.accessToken;
NSString *refreshToken = user.authentication.refreshToken;
我只是让它像这样发送服务器AuthCode
- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
withError:(NSError *)error {
if (!error) {
NSString *serverAuthCode = user.serverAuthCode;
然后在服务器上运行此代码以获取访问令牌
$access_token = $client->authenticate($google_server_auth_code);
$client->setAccessToken($access_token);
然后,当访问令牌过期时,我运行这个来刷新它
$access_token = $client->refreshToken($client->getRefreshToken());
$client->setAccessToken($access_token);
您需要在某个时候实际使用刷新令牌。
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
$client->getAccessToken();
从我的Oauth2Authentication中删除的代码。php示例
笔记
还要记住,刷新令牌是基于用户/客户端的。因此,如果令牌是由一个客户端生成的,那么不同的客户端可能无法使用它。如果您可以在php应用程序中使用Ios代码中创建的刷新令牌,我会非常惊讶。客户端类型不同。
我刚开始使用Spring Reactor3(WebFlux),当试图使用WebClient使用RESTendpoint返回Flux时,我得到了以下错误。
Kafka作为消费者在本地主机中已经很好地工作了,但是,当我在远程机器中创建消费者时,我会遇到下一个错误: [2020-02-06 11:53:22,172]向主题TopicTest发送消息时出错key: null, value: 4 bytes with error:(org.apache.kafka.clients.producer.internals.ErrorLoggingCallback
1. 创建 Maven 工程 服务端部署完毕后,我们可以新建一个 Maven 工程使用 SOFARegistry 提供的服务。首先新建一个 Maven 工程,然后引入如下依赖: <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>registry-client-all</artifactId> <versi
发起请求 让我们从导入aiohttp模块开始: import aiohttp 好啦,我们来尝试获取一个web页面。比如我们来获取下GitHub的时间轴。 async with aiohttp.ClientSession() as session: async with session.get('https://api.github.com/events') as resp:
安装命令行工具 使用命令行工具 使用Python SDK 使用Web控制台
介绍 回忆下第10部分中的客户端5.1版。客户端使用一个Deferred来管理所有的回调链,其中包括一个格式转换引擎的调用。在那个版本中,这个引擎的实现是同步的。 现在我们想实现一个新的客户端,使用我们在第十二部分实现的服务器提供的格式转换服务。但这里有一个问题需要说清楚:由于格式转换服务是通过网络获取的,因此我们需要使用异步I/O。这也就意味着我们获取格式转换服务的API必须是异步实现的。换句话