天道酬勤,学无止境

Google.Apis sharing access and refresh tokens

Until now I had one client (web application) that was doing the OAUTH2 authorization flow, and then would send to the server (ASP.NET Web API) both the Access Token and the Refresh Token.

Then on the server, those tokens would be used to do several operations against the Google API.

Everything perfect until now we had the need of adding mobile clients doing the same OAUTH2 authorization flow.

That required me to add those Android and iOS applications under the Googles Console. All 3 (Web, Android, and iOS) belong to the same project.

The problem comes now, since on the server I have to use the json file (with clientId and secret) that is given to me by google, which until now was the same that the webapp was using. But now since we have two new clients inside the same project, I assumed I would be able to access the Google Api using those same tokens I used before, which are now sent also by Android and iOS.

But that doesn't seem to work, I get :

Google.Apis.Auth.OAuth2.Responses.TokenResponseException: Error:"unauthorized_client", Description:"Unauthorized", Uri:""

Is there anyway to make it possible? I also thought about providing the json secrets file depending on what client sent me the tokens, but looking at the file structure, those are different, and iOS doesn't even have a json file, but a plist.

Any help would be greatly appreciated.

评论

Access and refresh tokens received on an Android or iOS device can be used only on this device. For example, Android OAuth client is registered in Google with its package name and signing-certificate fingerprint to restrict usage to your Android app.

Access and refresh tokens received in your Web Application can be passed to your backend server.

If you want your backend server to be able to make Google API calls on behalf of users while they are offline your server requires its own access token:

  • Authenticate the user in your Android and iOS application using Google Sign-In for Android or Google Sign-In for iOS;
  • request an additional access code after user authentication;
  • pass it to your backend server;
  • exchange this access code on the server to get its own access and refresh tokens using your backend server client ID and client secret.

Your backend server OAuth Client should have Web application type (you can share a OAuth client with your Web Application).

Detailed instructions can be found here:

  • Android - Enabling Server-Side Access;
  • iOS - Enabling Server-Side Access.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在我的网站上显示 Google Analytics 数据?(Display Google Analytics data on my web site?)
    问题 我正在尝试找出一种方法来在我的网站上显示从 Google Analytics 收集的数据。 我正在使用 NopCommerce,我想在管理部分的视图中显示此信息/统计信息。 可能有很多方法可以实现这一点,在网上搜索后我找到了一些使用 JavaScript 的例子,但我找不到一个很好的教程。 我还研究了将 Google Analytics 与 C# 集成,我发现了这个例子:http://biasecurities.com/2012/02/using-the-google-analytics-api-with-asp-net-mvc/#comment- 1310 可以从 GitHub 下载演示项目:https://github.com/jgeurts/Analytics-Example 但是,演示项目似乎不起作用,因为 google URL (https://www.google.com/analytics/feeds/accounts/default) 不再使用。 由于我使用的是 MVC 应用程序,因此最好通过在控制器中应用 Google Analytics 逻辑并将其显示在视图中来实现这一点。 或类似的东西。 谷歌在这里提供了一个查询工具来试验,所以不应该从谷歌分析中硬提取数据并将数据显示在网站上:https://ga-dev-tools.appspot.com
  • 使用预先存在的访问令牌通过 ASP.NET 创建 YouTube 服务(Creating a YouTube Service via ASP.NET using a pre-existing Access Token)
    问题 我一直在开发一个网站,供用户将视频上传到共享的 YouTube 帐户以供以后访问。 经过大量工作,我已经能够获得一个活动令牌和可行的刷新令牌。 但是,初始化YouTubeService对象的代码如下所示: UserCredential credential; using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) { credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, // This OAuth 2.0 access scope allows an application to upload files to the // authenticated user's YouTube channel, but doesn't allow other types of access. new[] { YouTubeService.Scope.YoutubeUpload }, "user", CancellationToken.None ); } var youtubeService = new
  • Google.GData.Client.GDataRequestException-旧代码中的身份验证突然失败(Google.GData.Client.GDataRequestException - Authentication suddenly fails in old code)
    问题 尝试对Google云端硬盘上的电子表格进行身份验证和访问时,我突然开始遇到以下异常: 未处理的异常:Google.GData.Client.GDataRequestException:执行自动回避请求返回了意外结果:Google.GData.Client.Utilities.QueryClientLoginToken(Google.GData.Client.Utilities.getAuthException(TokenCollection令牌,Htt pWebResponse响应)处为404 Google.GData.Client.GDataGAuthRequest.QueryAuthToken(GDataCredentials gc),Google.GData.Client.GDataGAuthRequest.EnsureCredentials()。 Google.GData.Client.GDataGAuthRequest.EnsureWebRequest()(在Google.GData.Client.GDataRequest.Execute()在Google.GData.Client.GDataGAuthRequest.Execute(Int32 retryCounter)在Google.GData.Client.GDataGAuthRequest
  • 如何从授权的 access_token 创建 GoogleCredential?(How do I create a GoogleCredential from an authorized access_token?)
    问题 我有一个像这样的 OAuth2 令牌...... {{ "access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "expires_in": "3600", "refresh_token": "xxxxxxxxxxxxxxxxxx", "token_type": "Bearer", }} 我正在尝试创建一个 DriveService 对象... Service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "foo", }); (像这样?) 但我显然没有正确执行此操作,并且无法找到文档。 当我尝试创建GoogleCredential以传递给DriveService GoogleCredential credential = GoogleCredential.FromJson(credentialAsSerializedJson).CreateScoped(GoogleDriveScope); 我收到以下异常: 分享 回答1 我设法弄明白了这一点。 解决方案是使用我的 ClientID 和 ClientSecret 创建一个Google
  • 我是否可以正确执行验证用户的Android应用内订阅的步骤?(Am I getting the steps right for verifying a user's Android in-app subscription?)
    问题 我制作的应用程序不需要用户帐户/登录,并允许用户购买订阅。 我想使用Google Play开发者API来验证用户是否具有购买/活动订阅。 从所有文档中,我收集了以下步骤。 他们是正确的,您能回答其中的两个问题吗? 在Google API控制台中创建一个服务帐户。 保存提供给我的私钥(如该示例代码所示,在什么地方?一定不在我的代码中/在设备上) 使用Google API for Java客户端库创建并使用私钥对JWT进行签名(如何?文档给了我这个,但那不是Java代码...我该怎么办?) 构造访问令牌请求,并访问API 应用程序现在可以将GET请求发送到API,以查明用户是否有订阅访问令牌过期后,请返回步骤3。 另外,我有一个Web服务,尽管我对Web服务或Web服务编程一无所知。 编辑:这些步骤不正确。 请参阅以下我的答案以获取正确的步骤。 但是,请注意,这仅适用于使用服务帐户(因为我不想要求用户必须明确允许API访问) 回答1 事实证明,我的步骤不正确。 我花了数周的时间才弄清楚这一点,而且似乎在其他任何地方都没有记录。 别客气: 在Google API控制台中创建一个Web应用程序帐户。 将任何网站作为“重定向URI”; 没关系,因为您将不会真正使用它。 创建帐户时,您将获得客户端ID和客户端密码。 在计算机上的浏览器中,转到https://accounts.google
  • Nodemailer / Gmail-什么是刷新令牌,如何获得令牌?(Nodemailer/Gmail - What exactly is a refresh token and how do I get one?)
    问题 我正在尝试使用nodemailer在节点应用程序中创建一个简单的联系表单。 我希望所有的味精都从为此目的创建的Gmail帐户发送到我的个人邮件。 在客户端,我要做的就是获取客户的名称/邮件/消息并将其发送到服务器。 它在本地工作正常,但部署后无法工作(在heroku btw上)。 快速搜索之后,似乎我必须从Google Developers Console生成ClientId和ClientSecret (确实如此),但是在生成“刷新令牌”时,我完全迷失了。 var smtpTransport = nodemailer.createTransport("SMTP",{ service:"Gmail", auth:{ XOAuth2: { user:"myaccount@gmail.com", clientId:"", clientSecret:"", refreshToken:"" } } }); 我很困惑:什么是刷新令牌,如何获得令牌? 回答1 该答案原作者的注释: 因此,我终于设法弄清楚了。 令我惊讶的是,我找不到更多的资源,因此对于那些需要将Gmail与Nodemailer一起使用的人来说, 我在这里找到了答案:http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html
  • 如何授权 google-api-ruby-client?(How to authorize the google-api-ruby-client?)
    问题 我正在按照此处的基本用法示例使 google-api-ruby-client gem 工作:基本用法 require 'google/apis/drive_v2' Drive = Google::Apis::DriveV2 # Alias the module drive = Drive::DriveService.new drive.authorization = ... # See Googleauth or Signet libraries # Search for files in Drive (first page only) files = drive.list_files(q: "title contains 'finances'") files.items.each do |file| puts file.title end 我被困的地方是drive.authorization 。 我已经通过 gem omniauth-google-oauth2 为用户获得了授权令牌。 如何将该令牌与 google-api-ruby-client 一起使用? 回答1 我也被卡住了。 IMO Google 应该在他们的文档中更详细地阐述,特别是因为我们所要做的只是添加一个请求标头...... 无论如何,这是一个例子。 # # Note I don't think we
  • .NET Google api 1.7 beta 使用刷新令牌进行身份验证(.NET Google api 1.7 beta authenticating with refresh token)
    问题 我一直在查看 Oauth .Net Google Apis,以便通过 OAuth 进行身份验证并使用 Google Drive API。 具体来说,我想使用我已经存储的刷新令牌,以便使用它来实例化 GoogleDrive 服务。 我找到了像 https://code.google.com/p/google-api-dotnet-client/source/browse/Tasks.SimpleOAuth2/Program.cs?repo=samples 这样的示例 这似乎使用“GoogleWebAuthorizationBroker.AuthorizeAsync”,但我不确定如何使用该方法与刷新令牌而不是您在此示例中似乎提供的客户端机密。 回答1 如果我理解正确,您会问如何基于现有的刷新令牌创建新的 Google 服务。 因此,您可以执行以下操作: var token = new TokenResponse { RefreshToken = "YOUR_REFRESH_TOKEN_HERE" }; var credentials = new UserCredential(new GoogleAuthorizationCodeFlow( new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = [your
  • How Google API V 3.0 .Net library and Google OAuth2 Handling refresh token
    In my application I am using Google API V 3.0 .Net library with Google OAuth2 to synchronize Google calender and outlook calender. I am using below code to get the Google.Apis.Calendar.v3.CalendarService service object. During authentication I stored the Json file and from that I am requesting for Google.Apis.Auth.OAuth2.UserCredential object. private Google.Apis.Auth.OAuth2.UserCredential GetGoogleOAuthCredential() { GoogleTokenModel _TokenData = new GoogleTokenModel(); String JsonFilelocation = "jsonFileLocation; Google.Apis.Auth.OAuth2.UserCredential credential = null; using (var stream =
  • Google API V 3.0 .Net库和Google OAuth2处理刷新令牌的方式(How Google API V 3.0 .Net library and Google OAuth2 Handling refresh token)
    问题 在我的应用程序中,我使用Google API V 3.0 .Net库和Google OAuth2来同步Google日历和Outlook日历。 我正在使用下面的代码来获取Google.Apis.Calendar.v3.CalendarService服务对象。 在身份验证期间,我存储了Json文件,并从该文件中请求Google.Apis.Auth.OAuth2.UserCredential对象。 private Google.Apis.Auth.OAuth2.UserCredential GetGoogleOAuthCredential() { GoogleTokenModel _TokenData = new GoogleTokenModel(); String JsonFilelocation = "jsonFileLocation; Google.Apis.Auth.OAuth2.UserCredential credential = null; using (var stream = new FileStream(JsonFilelocation, FileMode.Open, FileAccess.Read)) { Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.Folder = "Tasks.Auth
  • 带有 Google API 的 Xamarin.Auth:更新凭据?(Xamarin.Auth with Google APIs: Renew credentials?)
    问题 我正在尝试将 Xamarin.Auth 与 Xamarin Google-API 结合使用,以登录 Google 并访问云端硬盘。 我已经设法让几乎所有东西都正常工作,但身份验证令牌似乎在大约一个小时后过期。 一段时间内一切正常,但大约一个小时后,当我尝试访问时,出现 Invalid Credentials [401] 错误和泄漏: Google.Apis.Requests.RequestError Invalid Credentials [401] Errors [ Message[Invalid Credentials] Location[Authorization - header] Reason[authError] Domain[global] ] : GoogleDriveAgent: FetchRemoteFileList() Failed! with Exception: {0} [0:] Google.Apis.Requests.RequestError Invalid Credentials [401] Errors [ Message[Invalid Credentials] Location[Authorization - header] Reason[authError] Domain[global] ] : GoogleDriveAgent
  • 使用有效的 access_token 时缺少令牌端点 URI(Missing token endpoint URI while using a valid access_token)
    问题 突然间(可能是 gem 更新?)调用 Google api 停止工作。 我已经能够检索 gmail 线程,但不能再检索了。 到目前为止我所拥有的: 我能够检索用于离线访问的刷新令牌。 所以我存储了刷新和访问令牌。 伟大的。 现在我想检索个人资料信息。 这就是我所做的(请注意,这曾经工作得很好!) 我将在下面的每一行之后添加一个看跌期权,以向您展示我们得到了什么...... module AuthHelper require 'google/api_client/client_secrets' ... client = Signet::OAuth2::Client.new(access_token: user.gmail_access_token) service = Google::Apis::GmailV1::GmailService.new service.authorization = client service.get_user_profile('me') # retrieve threads ... end 让我打印我得到的回复: CLIENT : --- !ruby/object:Signet::OAuth2::Client authorization_uri: token_credential_uri: client_id: client_secret
  • 使用 Google API Client,如何创建客户端(With Google API Client, how to create client)
    问题 我正在努力使用 Google API 客户端:https://github.com/google/google-api-ruby-client 具体来说,我想使用以下google_contacts_api.rb通过 Google API 客户端访问 Google 通讯录:https://gist.github.com/lightman76/2357338dcca65fd390e2 我正在尝试像这样使用google_contacts_api.rb (x 是故意的,实际上是正确的键): require './lib/google_contacts_api.rb' auth = User.first.authentications.first client = OAuth2::Client.new('x', 'x', :site => 'https://accounts.google.com') oauth2_object = OAuth2::AccessToken.new(client, auth.token) x = ContactList::GoogleContactsApi.new(client, oauth2_object).all_contacts 这是错误的undefined method get' for # 你的意思是? 宝石`
  • 授权命令行工具使用Google API(通过OAuth2.0或其他方式)(Authorizing command line tool to consume Google APIs (through OAuth2.0 or anything else))
    问题 我想我了解OAuth 2.0如何在移动应用程序或网站的上下文中工作-我的情况也不是。 我有一个C ++命令行应用程序,我想授予对其中一个Google Services(Google Fusion Tables)的访问权限,但我认为这个问题适用于任何Google Services,或者可能适用于任何必须处理的命令行应用程序使用OAuth2。 我有用户名。 我有密码(用户输入了密码)。 我需要获取令牌,以便可以通过Curl拨打电话。 最简单的方法是什么? 更新1: 阅读完文档后,似乎最痛苦的OAuth2流将是“已安装的应用程序”。 我在想的是,我的命令行工具将在不需要令牌的情况下向公共表发出请求(但似乎我们仍然需要从Google发送一个AppID,我可以从Google API信息中心获取该ID)。 每当我的命令行工具需要使用私有资源时,都将要求该用户提供Google提供的授权码(然后我的命令行工具可以使用该授权码来获取可用的令牌)。 如果用户未在命令行中提供授权码,则我的工具将只打印一个链接,用户可以将该链接粘贴到URL上以生成授权码。 链接看起来像这样: https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/fusiontables&redirect_uri=urn
  • OAuth 2 Google API 刷新令牌为空(OAuth 2 Google API refresh token is null)
    问题 我正在按照此 Google 示例代码开发 Asp.NET MVC5 应用程序。 我希望应用程序经过身份验证并由用户创建访问令牌(配置阶段),稍后我需要能够使用刷新令牌(无需用户干预,例如“离线”)。 控制器: public async Task<ActionResult> IndexAsync(CancellationToken cancellationToken) { var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()). AuthorizeAsync(cancellationToken); if (result.Credential != null) { var service = new Google.Apis.Admin.Directory.directory_v1.DirectoryService(new BaseClientService.Initializer { HttpClientInitializer = result.Credential, ApplicationName = "My Application" }); return View(); } else { return new RedirectResult(result.RedirectUri);
  • Google OAuth getting refresh token using javascript generated OAuth access_token
    I'm developing application where I need to perform server side requests to google API on user behalf. In basic terms my application does this: Using gapi javascript library requests authentication and gets access_token the problem with that token that its short lived and there is no way I can extend it as far as I can tell using javascript google apis. Now my question is having that short lived token how can I use server side SDK (in my case c#) or direct WebClient connection to request a long lived (refresh_token)? When client side authentication is done I have this data: function
  • How to use Google APIs without continuously explicit user consent from a progressive web application?
    I have a progressive web application that needs write-access to the Google Drive API for uploading data (media files) the user is creating (either online or offline) in the background while online. It does not really need a server (except for serving the required files, so a static server is sufficient), all of the work could be done on the web application client side. Since uploading needs to happen on the background, whenever the user is online again (using a service worker and the background sync one-shot API), an access token is not enough for my need (the user can be offline/not use the
  • Google OAuth 使用 javascript 生成的 OAuth access_token 获取刷新令牌(Google OAuth getting refresh token using javascript generated OAuth access_token)
    问题 我正在开发应用程序,我需要代表用户对谷歌 API 执行服务器端请求。 基本上,我的应用程序是这样做的:使用gapi javascript库请求身份验证并获取access_token该令牌的问题,它的生命周期很短,并且我无法使用javascript google apis扩展它。 现在我的问题是拥有那个短暂的令牌,我如何使用服务器端 SDK(在我的例子中是 c#)或直接 WebClient 连接来请求一个长期的(refresh_token)? 客户端身份验证完成后,我有以下数据: function handleAuthResult(authResult) { if (authResult && !authResult.error) { //Authentication successful //authResults.access_token - has a valid token that expires in 60 minutes //Say token set to this:ya29.AHES6ZRadMF0y*********c8GOC8KYZFkc6q1fCeT_Q //Now I can send it using ajax to the server handler to try to extend } else { $("#google-cal
  • YouTube API-使用Google管理员帐户访问多个YouTube频道(品牌帐户)(YouTube APIs - Access mutiple youtube channels (Brand Accounts) using Google Admin account)
    问题 我需要使用YouTube分析和报告Api从视频中提取信息。 使用我的Google帐户登录YouTube时,我可以访问多个YouTube品牌帐户。 使用“尝试一下”测试API,一旦切换到该渠道所属的品牌帐户,我就只能检索该渠道的数据,否则会收到403-禁止的错误。 有什么方法可以使用我用来登录的Google帐户提取数据? 因为一旦在开发人员控制台中创建了凭据,它们便会与Google帐户而不是品牌帐户相关联。 我的Google帐户在品牌帐户上具有经理角色。 我正在搜索要在请求中使用的onBehalfOfContentOwner字段,但是我不知道如何获取此ID,并且由于我们谈论的是品牌帐户,因此我不确定该ID是否适用于我的情况。我如果我错了。 回答1 我只是两天前与之抗争。 事实证明这是可能的,只是没有记录,并且工作方式与您预期的有所不同: 在开发人员控制台中创建凭据后,它们将与Google帐户(而不是品牌帐户)相关联。 第一次尝试时,我有完全相同的误解(甚至发现了品牌帐户的client_id)。 原来您不想使用品牌的oauth信息-您想使用自己的client_id / client_secret代表品牌帐户创建刷新令牌,然后使用该令牌创建auth令牌。 脚步: 使用您的主要帐户,通过https://console.developers.google.com/apis
  • 如何在没有渐进式 Web 应用程序持续明确的用户同意的情况下使用 Google API?(How to use Google APIs without continuously explicit user consent from a progressive web application?)
    问题 我有一个渐进式 Web 应用程序,需要对 Google Drive API 进行写访问,以上传用户在线时在后台创建(在线或离线)的数据(媒体文件)。 它并不真正需要服务器(除了提供所需的文件,所以静态服务器就足够了),所有的工作都可以在 Web 应用程序客户端完成。 由于上传需要在后台进行,每当用户再次在线时(使用服务工作者和后台同步一次性 API),访问令牌不足以满足我的需要(用户可以离线/不使用网络应用程序数天),据我所知,刷新令牌不应该存储在 Web 应用程序客户端。 即使是这样,我仍然需要客户端机密,这意味着我必须使用服务器(或将机密保存在 Web 应用程序客户端中,这是一个禁忌)才能刷新令牌。 目前使用 OAuth2 方案的方式似乎与无服务器渐进式 Web 应用程序不一致,或者我可能遗漏了一些东西。 在这方面,渐进式 Web 应用程序更像是 Chrome 应用程序,但我必须在 Google API 控制台中为我的应用程序提供一个 Chrome 应用程序 ID,我没有(也不打算)拥有它,并且 Chrome 应用程序使用用于获取令牌的 Chrome 身份 API,我不打算使用(也不能)。 我目前正在使用一个实际的 Node.js 服务器,它负责授权步骤,将访问令牌和刷新令牌保存在数据库中,并在请求时将现有的或新的访问令牌返回给客户端。 服务器在这里是多余的