标签: google-oauth-java-client

Google OAUTH:请求中的重定向URI与注册的重定向URI不匹配

我正试图从我的基于Java的网络应用程序上传到YouTube,我花了几天时间来了解问题的原因和地点,我无法得到它,因为现在我正在把头发拉出来.

我在Google控制台中注册了我的网络应用程序,因此我获得了一对客户端ID和密码以及使用我的配置下载JSON类型文件的可能性.

所以这是配置:

{
    "web":{
        "auth_uri":"https://accounts.google.com/o/oauth2/auth",
        "client_secret":"***",
        "token_uri":"https://accounts.google.com/o/oauth2/token",
        "client_email":"***",
        "redirect_uris":["http://localhost:8080/WEBAPP/youtube-callback.html","http://www.WEBAPP.md/youtube-callback.html"],
        "client_x509_cert_url":"***",
        "client_id":"***",
        "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
        "javascript_origins":["http://www.WEBAPP.md/"]
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何从Google获取默认网址?

The redirect URI in the request: http://localhost:8080/Callback did not match a registered redirect URI

它总是给我默认的http://localhost:8080/CallbackURL而不是我的.

IDE控制台告诉我:

Please open the following address in your browser: https://accounts.google.com/o/oauth2/auth?client_id=***&redirect_uri=http://localhost:8080/Callback&response_type=code&scope=https://www.googleapis.com/auth/youtube.upload Attempting to open that address in the default browser now...

我使用的是最新版本的依赖项: google-api-services-youtube v3-rev99-1.17.0-rcgoogle-api-services-youtubeAnalytics v1-rev35-1.17.0-rc

java youtube-api google-oauth youtube-data-api google-oauth-java-client

49
推荐指数
3
解决办法
11万
查看次数

强制用户通过Google OAuth2选择帐户

我的应用程序中有以下工作流程:

  1. 用户登录我的自定义应用
  2. 用户点击按钮即可关联其YouTube帐户
  3. 应用程序使用下面的代码列表发出服务器端请求
  4. 用户被重定向到google auth网址

此时,发生以下两种情况之一:

[我从不想要这种行为] - 如果用户只登录了一个Google帐户(例如gmail,Google Apps for Domains等等),则系统永远不会要求用户选择要关联的帐户.它只是假设他们想要使用他们登录的那个并继续它的快乐方式.

[我一直想要这种行为] - 如果用户未登录任何Google帐户,或者他们登录了多个Google帐户,则系统会要求他们选择要继续使用的帐户.

问题:即使用户当前登录到单个Google帐户,我还有办法强制用户选择帐户吗?

码:

private def getFlow() = {
  if (flow == null) {
    logger.info("Using OAuth client secrets file: " + GoogleOAuthService.CLIENT_SECRETS_JSON)
    clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(),
      new InputStreamReader(getClass.getResourceAsStream(GoogleOAuthService.CLIENT_SECRETS_JSON)));
    redirectUri = clientSecrets.getDetails().getRedirectUris().get(0)
    flow = new GoogleAuthorizationCodeFlow.Builder(
      httpTransport, JacksonFactory.getDefaultInstance(), clientSecrets, SCOPES).setDataStoreFactory(
      dataStoreFactory).setAccessType("offline").setApprovalPrompt("force").build()
  }
  flow
}

def newAuthorizationUrl(userId: String) = {
  val urlRequest = getFlow().newAuthorizationUrl()

  urlRequest.setAccessType("offline")
   .setRedirectUri(redirectUri).setState(userId).build()
}
Run Code Online (Sandbox Code Playgroud)

google-oauth google-oauth-java-client google-oauth2

13
推荐指数
2
解决办法
1926
查看次数

使用Android进行Gmail API访问

我正在尝试使用Android应用程序访问Gmail API.我已成功请求并使用所有可用范围组合接收了访问令牌.但似乎每次我实际尝试使用Gmail API命令时,我都会得到一个403 exception reading: Access not configured please use Google developers console to activate the api...

不用说,API已激活,并且使用正确的包名称和sha1代码创建了客户端密钥.相同的客户端ID适用于Google Plus功能.

是否有任何人遇到此问题或成功连接到Android的Gmail API?

谢谢

这是日志:

09-04 21:40:54.014: W/System.err(26717): com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
09-04 21:40:54.014: W/System.err(26717): {
09-04 21:40:54.014: W/System.err(26717):   "code" : 403,
09-04 21:40:54.014: W/System.err(26717):   "errors" : [ {
09-04 21:40:54.014: W/System.err(26717):     "domain" : "usageLimits",
09-04 21:40:54.014: W/System.err(26717):     "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
09-04 21:40:54.014: W/System.err(26717):     "reason" : "accessNotConfigured"
09-04 …
Run Code Online (Sandbox Code Playgroud)

android google-oauth google-schemas google-oauth-java-client gmail-api

12
推荐指数
2
解决办法
5965
查看次数

第二次尝试刷新令牌时如何修复“格式错误的身份验证代码”?

我正在开发一个带有 Angular 和 Cordova 插件的 Android 应用程序,我想将其与 Google 身份验证集成。我已经安装了cordova-plugin-googleplus 并且已成功集成到该应用程序中。当用户登录时,我会收到响应,我可以在其中获取 accessToken、配置文件用户信息和刷新令牌。

现在我想实现一个功能来刷新令牌,而不会每小时用新的提示屏幕打扰用户。

我已成功更新 accessToken,但仅在第一次有效

我用过这两种方式:

  1. 发送带有以下数据的curl请求
curl -X POST \
  'https://oauth2.googleapis.com/token?code=XXXXXXXXXXXXXXXX&client_id=XXXXXXXXXXXXXXXX.apps.googleusercontent.com&client_secret=YYYYYYYYYYYY&grant_type=authorization_code' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/x-www-form-urlencoded'
Run Code Online (Sandbox Code Playgroud)
  1. 使用 Google API Client Library for Java 在服务器端实现它并主要遵循这些代码

重点是,当用户第一次登录(使用 cordova-plugin-googleplus)时,我收到一个具有这种格式的刷新令牌

4/rgFU-hxw9QSbfdj3ppQ4sqDjK2Dr3m_YU_UMCqcveUgjIa3voawbN9TD6SVLShedTPveQeZWDdR-Sf1nFrss1hc
Run Code Online (Sandbox Code Playgroud)

如果一段时间后我尝试以上述任何一种方式刷新令牌,我会收到带有新 accessToken 和新刷新令牌的成功响应。新的刷新令牌具有其他格式

1/FTSUyYTgU2AG8K-ZsgjVi6pExdmpZejXfoYIchp9KuhtdknEMd6uYCfqMOoX2f85J
Run Code Online (Sandbox Code Playgroud)

在第二次尝试更新令牌时,我将令牌替换为第一个请求中返回的令牌

curl -X POST \
  'https://oauth2.googleapis.com/token?code=1/FTSUyYTgU2AG8K-ZsgjVi6pExdmpZejXfoYIchp9KuhtdknEMd6uYCfqMOoX2f85J&client_id=XXXXXXXXXXXXXXXX.apps.googleusercontent.com&client_secret=YYYYYYYYYYYY&grant_type=authorization_code' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/x-www-form-urlencoded'
Run Code Online (Sandbox Code Playgroud)

但这一次,两种方式(Curl 和 Java)我都遇到了相同的错误。

{
  "error" : "invalid_grant",
  "error_description" : "Malformed auth code."
}
Run Code Online (Sandbox Code Playgroud)

我在这个帖子上读到,将 clientId 指定为电子邮件是一个问题,但我还没有发现如何解决它,因为第一次登录是使用客户端 ID“XXXXXXX.apps.googleusercontent.com”完成的,并且如果我设置来自 google …

oauth-2.0 cordova google-oauth google-oauth-java-client cordova-plugins

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

在google开发者控制台下设置新的clientId时,必须使用"授权重定向URI"吗?

谷歌使用授权的重定向URI来进行回调以传递授权令牌.

它也用于谷歌验证.因此,当收到实际的oauth请求时,Google会检查请求中给出的回调网址是否与"授权重定向URI"相同,如果不是,则会抛出错误.

我的要求是阻止谷歌进行此验证,因为我希望能够在运行时传递不同的回调网址.我尝试将"授权重定向URI"作为空,但这不起作用.有什么建议 ?

google-api google-oauth google-oauth-java-client

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

具有两条腿OAuth的Gmail原子Feed收到401错误

我们遇到了包含两条腿OAuth的Gmail原子Feed问题,错误消息是"401未经授权".

错误消息如下所示.

<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)

直到上周,我们使用Gmail原子Feed都没有问题.从本周开始,即使我们对Gmail原子Feed和oauth没有任何变化,我们也遇到了这个问题.现在,所有用户(50,000个帐户)都不会出现此问题,但此问题越来越多.

看来这个问题是由谷歌方面引起的.

有没有人有同样的问题?

源代码如下.

private GoogleOAuthParameters mOauthParameters; 
private OAuthSigner mSigner; 

private final String SCOPE = "https://mail.google.com/mail/feed/atom";

GoogleService service;

String result = null;

mOauthParameters = new GoogleOAuthParameters();
mSigner = new OAuthHmacSha1Signer();

mOauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
mOauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);

service = new GoogleService("gmail","feed");
service.setOAuthCredentials(mOauthParameters, mSigner);
service.setConnectTimeout(timeOut);
service.setReadTimeout(timeOut * 5);

GDataRequest request = service.createFeedRequest(new URL(SCOPE +"?xoauth_requestor_id=" + email));
request.execute();
InputStream is = null;

try {
    is = request.getResponseStream();
    StringBuffer out = new StringBuffer();  
    byte[] …
Run Code Online (Sandbox Code Playgroud)

gmail google-api google-api-java-client google-oauth google-oauth-java-client

6
推荐指数
1
解决办法
2190
查看次数

Gmail(企业版)API 不允许从 Alias 发送电子邮件?

我想使用不同的“角色”(例如 info@ 、 customer-support@ 、 tech-support@ 、 no-reply@ )向我的客户发送电子邮件。

我尝试过两种方法:

  1. 我的 Gmail for Business 应用程序中有多个“用户”/帐户。
  2. 具有多个别名的单个 Gmail 帐户。

我首先为我的 Gmail for Business 应用程序设置一个具有全局委托的服务帐户。

为了测试它是否有效,我设置了 2 个用户:lev@mydomain.com 和 root@mydomain.com。事实上,我可以成功地从 lev@ 和 root@ 发送电子邮件。

然而,当我尝试为我的应用程序添加 5 个不同的用户帐户时,Gmail 对机器人/滥用感到偏执,并要求我证明所有帐户都是“人性化”的,包括设置密码、登录和通过电话进行短信验证。此外,他们要求不同的账户使用不同的手机来证明是不同的人。因此,账户的设置成为一个主要问题。

我还想避免创建多个帐户,因为我要为每个帐户付费,而且从语义上讲,所有角色都只是一个帐户。所以别名似乎是一个更好的主意。

问题是,当我尝试发送电子邮件并将“发件人”字段设置为别名(例如 from:no-reply@mydomain.com)时,我收到以下异常:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Delegation denied for root@mydomain.com",
    "reason" : "forbidden"
  } ],
  "message" : "Delegation denied for root@mydomain.com"
}
Run Code Online (Sandbox Code Playgroud)

有人遇到并解决过这个问题吗?

认证/凭证代码如下:

/*
 * Set …
Run Code Online (Sandbox Code Playgroud)

google-oauth google-oauth-java-client gmail-api

6
推荐指数
1
解决办法
2214
查看次数

Google OAuth 同意屏幕提及我的应用程序未请求的数据

我的网络应用程序使用“使用 Google for Web 登录”(https://accounts.google.com/gsi/client脚本)。由于各种原因,我现在想摆脱 JS 库并仅使用Google OAuth Client Library for Java版本 1.34.1 来实现所需的步骤。

虽然该过程本身有效,但令我恼火的是,尽管我的应用程序只要求openid email范围,但 Google 在同意(帐户选择器)对话框的底部显示以下消息:

为了继续,Google 将与 APPNAME 共享您的姓名、电子邮件地址、语言首选项和个人资料图片。

此消息对我的用户具有高度误导性,因为尽管有此消息,令牌不包含任何允许我的应用程序读取全名、个人资料图片或其他详细信息的范围 - 仅openid https://www.googleapis.com/auth/userinfo.email(相当于openid email)正如我所要求的。我故意不包含profile在范围列表中,因为我的应用程序只需要帐户 ID(用于匹配应用程序帐户)和电子邮件地址。

为什么会发生这种情况?难道我做错了什么?当我使用Google Identity客户端库时,没有出现这样的消息。从文档来看,似乎没有办法影响这种行为。

这是我重定向到的 URL(添加了换行符以提高可读性)。它是使用AuthorizationCodeFlow构建的。

https://accounts.google.com/o/oauth2/auth
?access_type=offline
&client_id=MYID.apps.googleusercontent.com
&redirect_uri=MYURL
&response_type=code
&scope=openid%20email
&state=MYSTATE
&nonce=MYNONCE
Run Code Online (Sandbox Code Playgroud)

更新1

使用Google OAuth 2.0 Playground并输入openid email. 它重定向到这个 URL

https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount
?redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground
&prompt=consent
&response_type=code
&client_id=407408718192.apps.googleusercontent.com
&scope=openid%20email
&access_type=offline
&service=lso
&o2v=2
&flowName=GeneralOAuthFlow …
Run Code Online (Sandbox Code Playgroud)

java google-oauth google-oauth-java-client openid-connect

6
推荐指数
1
解决办法
931
查看次数

Google OAuth 2.0增量授权无效

我有一个需要访问Google API组合的服务器端应用程序,对于我们应用程序的某些用户,我们只需要访问一个API /范围组(例如Google Drive),其他用户访问另一个API /范围(比如说) G +),对于一些我们需要访问两者(用户可以在以后链接到应用程序的其他部分).

我们想为此使用增量授权,但是当我们第一次请求访问一组范围,然后请求访问另一组范围时,我们为第二个请求获取的访问令牌只允许访问第二个范围,而不是最初请求的范围和新范围的组合,如上面给出的Google链接中所述.

我们所有的授权网址都包含include_granted_scopes=true参数.

我们还需要做一些额外的步骤才能启用增量身份验证吗?我们在服务器端应用程序中使用Google oauth Java客户端库,如果这有任何区别的话.

这个问题描述了一个类似的问题,但对于已安装的应用程序,它包含一个很好的简单脚本来重现问题.

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

5
推荐指数
1
解决办法
854
查看次数

通过服务帐户和 OAuth2 对 GoogleDrive 进行身份验证时出现 401 响应

我似乎在尝试将 Java 应用程序添加到存储在我的 GoogleDrive 文件夹中的文件列表时遇到了障碍。这

我在开发人员控制台中有一个项目设置。我已为该项目启用了 Drive API 我为服务帐户创建了身份验证凭据 - 并且正在使用生成的 P12 密钥。

我的代码如下所示:

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.auth.oauth2.CredentialRefreshListener;
import com.google.api.client.auth.oauth2.TokenErrorResponse;
import com.google.api.client.auth.oauth2.TokenResponse;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class GoogleDriveTest {

    /** Global instance of the JSON factory. */
    private static final JsonFactory JSON_FACTORY = new JacksonFactory() ;

    /** instance of the HTTP transport. */
    private static final HttpTransport …
Run Code Online (Sandbox Code Playgroud)

google-drive-api google-oauth google-oauth-java-client

5
推荐指数
0
解决办法
3107
查看次数