小编DaI*_*mTo的帖子

"需要登录"401通过OAuth 2.0使用服务帐户呼叫v3 Google Calendar API时未经授权的消息

首先,让我解释一下我要做的事情,因为这是一个两部分问题.

我建立在内部通过的OAuth2一个谷歌帐户验证一个JAX-RS的服务,所以它可以访问和操作谷歌日历.这项服务将通过一个网站(的Joomla),这将允许登录到网站的用户注册与日历事件他们的电子邮件地址,以便他们可以得到电子邮件通知当事件附近被调用.这些用户不了解底层Google帐户.

所以我的第一个问题是使用服务帐户身份验证是正确的吗?查看Google文档,它是唯一适合非人类身份验证的用例(因此服务器到服务器身份验证).

第二个问题是,我已经写了一些代码来做到这一点,但我拿回401 /未经授权的响应返回以下错误回来时,我调用execute方法日历饲料.此代码已从Google示例中取消.

我正在使用Google Calendar API的v3-rev3-1.5.0-beta.我已在帐户中启用了Calendar API,并创建并下载了私钥,该私钥在下面的代码中使用.

我在本地调用Eclipse中的代码,而不是从Web服务器调用.

所以我做的第一个调用是取回一个凭证对象(Id用X混淆):

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
.
.
.
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId("284XXXXXXXX@developer.gserviceaccount.com")
            .setServiceAccountScopes(CalendarScopes.CALENDAR)
            .setServiceAccountPrivateKeyFromP12File(new File("D:/3cd8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXd635e-privatekey.p12"))
            .build();
Run Code Online (Sandbox Code Playgroud)

下一步是调用Calendar API,就像这样(之间没有其他代码调用):

 Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY)
        .setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential)
        .build();

 CalendarList feed = calendar.calendarList().list().execute();
Run Code Online (Sandbox Code Playgroud)

对list().execute()的调用导致以下错误:

com.google.api.client.googleapis.json.GoogleJsonResponseException:401 Unauthorized {"code":401,"errors":[{"domain":"global","location":"Authorization","locationType":"标题","消息":"需要登录","原因":"必需"}},"消息":"需要登录"} com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException. java:159)com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187)com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115) at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112)at the com.google.api.services.calendar.Calendar $ CalendarList $ List.execute(Calendar.java:510)at uk .org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service.java:55)at uk.org.reigatepriorybowmen.Service.main(Service.java:74)

服务帐户设置如下:

在此输入图像描述

那么,我做错了什么?!我花了几个小时在谷歌上寻找解决方案,所以这是我最后的希望.

非常感谢您的帮助.

贾斯汀

google-calendar-api oauth-2.0 google-api-java-client google-oauth

18
推荐指数
2
解决办法
4万
查看次数

直接使用Google Analytics Measurement Protocol API的费率限制是多少?

Google Analytics(分析)集合限制和配额的文档中

它提供的rate limits是由谷歌提供的各种库实现的.我似乎无法找到直接发布到测量协议(https://www.google-analytics.com/collect)的用户的已发布速率限制.

有没有,如果有的话是什么?


2015年7月10日编辑 -

一些评论者要求提供我发送的数据类型的示例.

使用一系列调用wget,每次调用之间休眠一秒钟.

以下是移除应用名称和跟踪代码的示例:

wget -nv --post-data 'ul=en&qt=7150000&av=0.0.1&ea=PLET&v=1&tid=<my_tracking_code>&ec=Move+to+Object&cid=1434738538-738-654031&an=<my_app_name>&t=event' -O /dev/null 'https://www.google-analytics.com/collect'
Run Code Online (Sandbox Code Playgroud)

我已经尝试将这些查询发送到/ debug端点,并且所有这些查询都是有效的.我的第一次上传按预期工作,报告看起来不错.随后将相同数据集上传到不同的GA属性会产生不同的结果.有时报告中不会显示任何数据.有时,部分数据会显示在报告中 在上传过程中,实时报告始终显示活动.


google-analytics google-api measurement-protocol

18
推荐指数
1
解决办法
1928
查看次数

使用Youtube Analytics API时出现错误:"消息":"需要登录"

我正在使用youtube api.当我点击此网址时" https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2015-01-01&end-date=2016-01-31&metrics=likes% 2Cdislikes&key = {API Key} "

它给了401

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Login Required"
 }
}
Run Code Online (Sandbox Code Playgroud)

但是我在浏览器中点击了" https://developers.google.com/apis-explorer/?" 它工作正常.
如何使第一个请求起作用?

google-api google-oauth youtube-data-api youtube-analytics-api

17
推荐指数
2
解决办法
2万
查看次数

Google API刷新令牌限制

我正在开发一个应用程序,我需要访问多个谷歌日历.所有这些日历都来自不同的用户.现在我正在使用OAuth2进行同步.但据我了解,我每个客户端ID只能生成25个刷新令牌.

Note: Save refresh tokens in secure long-term storage and continue to use 
them as long as they remain valid. Limits apply to the number of refresh 
tokens that are issued per client-user combination, and per user across all clients, 
and these limits are different. If your application requests enough refresh tokens 
to go over one of the limits, older refresh tokens stop working.
Run Code Online (Sandbox Code Playgroud)

按照建议,我在我的数据库中保留刷新令牌.但我的问题是,如果我有更多的客户想要同步他们的日历怎么办?有没有办法忽视这个极限?当然没有.我现在想到的只是创建更多客户端ID.有什么建议吗?

oauth google-calendar-api google-api google-oauth google-oauth2

16
推荐指数
1
解决办法
1万
查看次数

Google Analytics - 获取原始数据日志

我有一个将数据发送到Google Analytics的应用.我有兴趣在Hadoop集群上访问和存储这些数据.我猜这个原始数据将以日志的形式出现.特别是,我希望看到user_id,用户进行的搜索以及他/她决定在应用上支付的搜索选项.

我怎样才能做到这一点?我是GA的新手,我不是那个为应用程序设置GA的人.我只是想看看是否有办法可以访问这些原始数据.

想补充说我不能使用Big Query,因为我们无法访问它.设置GA的人对升级到Universal Analytics不感兴趣.

任何帮助/想法/建议表示赞赏.

谢谢!

hadoop google-analytics google-api raw-data universal-analytics

16
推荐指数
2
解决办法
2万
查看次数

Google API PHP离线访问,"invalid_grant:代码已被兑换"

如何在用户撤销授权之前永久授权Google客户端?

我正在尝试创建一个连接到Google日历的应用.它必须在PHP中运行,因此我使用谷歌提供的Google API PHP客户端.

该应用程序需要具有脱机访问权限,以便在用户不在会话中时可以使用.该应用程序旨在让用户在网站等上公开管理和显示他的日历.

我使用服务方法(具有客户端ID和客户端密钥)在Google控制台中创建了凭据.使用Google API客户端,我还要求用户授权.我打开一个新的浏览器窗口,用户授权,Google会返回授权码.我使用此代码,存储并使用它来授权客户端,该客户端成功连接到Google日历并交换数据.

现在,我明白这是一个即将到期的令牌.除非我使用离线访问,我设置.但是,几分钟或更短时间后,我总会收到错误:Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.

这是我用来连接客户端的代码:

$client = new \Google_Client();
$client->setApplicationName( 'My App' );
$client->setScopes( array( \Google_Service_Calendar::CALENDAR ) );
$client->setClientId( $this->google_client_id );
$client->setClientSecret( $this->google_client_secret );
$client->setRedirectUri( $this->google_client_redirect );
$client->setAccessType( 'offline' );

if ( $code = $this->google_client_auth ) {

    try {

        $client->authenticate( $code );

    } catch( \Exception $e ) {
            var_dump( $e );
    }    

}

return new \Google_Service_Calendar( $client );
Run Code Online (Sandbox Code Playgroud)

这是一个类中的方法.

客户端ID和客户端密钥存储在应用程序设置中.

我也将用户返回的代码存储在一个设置中,但我认为这是我做错的地方?我在一个单独的方法(也使用相同的客户端ID)中将链接放到Google OAuth窗口并秘密和设置离线方法).并获得授权工作.我可以到达日历.它只是不会持续很长时间...

php oauth google-api google-oauth google-api-php-client

16
推荐指数
1
解决办法
2万
查看次数

Google API Oauth2:所有用户只能使用一个刷新令牌吗?

我正在使用OAuth2身份验证,我有一个拥有多个用户的CMS,每个用户都有自己的配置文件.我们公司的Google帐户可以访问多个Google Analytics帐户.对于使用CMS的每个用户,我使用不同的用户名连接到Google AnalyticsAPI,每个用户的令牌都保存在数据库数据存储中.问题是,如果一个用户断开连接并撤消其令牌,则使用相同Google帐户的其他任何用户都无法访问Analytics API,这没有任何意义.

在此输入图像描述

编辑:经过进一步调查,我发现当第一个用户进行身份验证时,保存在数据存储中的令牌包含'refresh_roken'和'access_token'.但是,当其他用户进行身份验证时(他们使用相同的Google帐户,但使用不同的Google Analytics帐户),他们的令牌只会包含"access_token".如果其中一个人撤销了他的令牌,他们就会失去联系.

如何阻止这种情况发生并让每个用户都收到自己的refresh_token?


编辑2:

我在数据存储中存储单独的行,每个用户一个.让我澄清一下 - 如果你看一下这个图,想象一个CMS,其中一个CMS用户需要查看"Liz的个人账户"的统计数据,另一个CMS用户需要查看"Liz的团队账户"的统计数据.

两个CMS用户都来自同一家公司,他们都使用相同的Google帐户 - "liz@gmail.com".CMS用户A使用"liz@gmail.com"连接到Analytics API,收到refresh_token并想查看"Liz网站"的统计信息.然后CMS用户B也使用"liz@gmail.com"连接到Analytics API,但现在他不再收到refresh_token,只有access_token - 这是一个问题,因为在access_token之后将再次要求用户连接到期.

当一个用户断开连接时我通常做的是从数据存储中删除令牌并撤销令牌,但是我可能不应该撤销它,是吗?在任何情况下,如果在我的场景中用户A断开连接,这将删除他的数据存储令牌,这意味着我们将不再存储refresh_token,因为用户B首先没有它.

用户帐户图: 用户帐户图

c# google-api google-analytics-api google-api-dotnet-client google-oauth2

15
推荐指数
2
解决办法
2195
查看次数

验证Google Id令牌

我正在使用ASP.NET Core为Android客户端提供API.Android以Google帐户登录,并将ID令牌JWT作为承载令牌传递给API.我有应用程序工作,它确实通过了身份验证检查,但我不认为它正在验证令牌签名.

根据Google的文档,我可以将此网址称为 https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123,但我无法在服务器端找到相应的挂钩来执行此操作.另外根据Google文档,我可以以某种方式使用客户端访问API来执行此操作,而无需每次都调用服务器.

我的配置代码:

app.UseJwtBearerAuthentication( new JwtBearerOptions()
{

    Authority = "https://accounts.google.com",
    Audience = "hiddenfromyou.apps.googleusercontent.com",
    TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateAudience = true,
        ValidIssuer = "accounts.google.com"
    },
    RequireHttpsMetadata = false,
    AutomaticAuthenticate = true,
    AutomaticChallenge = false,
});
Run Code Online (Sandbox Code Playgroud)

如何让JWTBearer中间件验证签名?我已经接近放弃使用MS中间件并自行推出.

c# google-api jwt google-oauth asp.net-core

15
推荐指数
3
解决办法
1万
查看次数

尝试在我的应用中集成Google登录时无法找到"GoogleService-Info.plist"

我已经遵循:将Google登录集成到您的iOS应用中

然而,当我执行应用程序时,它会在应用程序委托中停止 - 甚至在我看到我的第一个视图控制器之前.

原因是因为我在"application didFinishLaunchingWithOptions withOptions","中写的这几行代码是:

"NSError* configureError;
[[GGLContext sharedInstance] configureWithError: &configureError];
    NSAssert(!configureError, @"Error configuring Google services: %@", configureError);

 [GIDSignIn sharedInstance].delegate = self;"
Run Code Online (Sandbox Code Playgroud)

在调试中,当它到达此代码时,它说

"由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'配置Google服务时出错:错误域= com.google.greenhouse代码= -200"无法配置GGL."UserInfo = 0x7ff9c2e1d000 {NSLocalizedRecoverySuggestion =检查GoogleService的格式和位置-Info.plist.,NSLocalizedDescription =无法配置GGL.,NSLocalizedFailureReason =无法解析提供的GoogleService-Info.plist.有关详细信息,请参阅日志.}'".

我把它GoogleService-Info.plist放在我的目录中,但它仍然无法正常工作.

xcode objective-c google-api ios google-signin

14
推荐指数
2
解决办法
3万
查看次数

添加到AppDelegate时找不到Google/Analytics.h文件

我正在尝试使用Cocoapods在我的ios项目中集成Google Analytics.然而,在经过对于步骤,直到将配置文件到我的项目,在AppDelegate中导入谷歌/ Analytics.h当我找不到错误的文件.试过以下事情:

  1. 添加$(SRCROOT)/Pods/GoogleAnalytics到构建设置中的用户标题搜索路径.

  2. 添加libGoogleAnalyticsServices.a为在构建阶段将二进制文件链接到库.

  3. -lGoogleAnalyticsServices在其他链接器标志中添加.

不要真的想做2和3,因为他们从Cocoapods免费.

我到底错过了什么?

google-analytics objective-c ios cocoapods

14
推荐指数
3
解决办法
2万
查看次数