标签: google-oauth2

Node.js"passport-google-oauth2"在Express应用程序中提供"无法获取用户配置文件"错误

同时开发的最后一个例子的入门(一使用谷歌OpenID身份验证策略的应用),更换后passport-google(其中有过时的2015年4月20日)passport-google-oauth2包(由谷歌OAuth认证策略2.0)并按照其文档页面上的说明示例进行了说明 ; 选择我的Google+帐户后,我收到了以下错误,该帐户由oath2.js模块引发,具体this._oauth2.get("https://www.googleapis.com/plus/v1/people/me",...)userProfile(accessToken, done)方法内调用.相关的源代码和模块依赖关系如下.

什么可能是问题的根源?

具体错误是:

InternalOAuthError: failed to fetch user profile
    at <...>\web-app\b4\node_modules\passport-google-oauth2\lib\oauth2.js:92:28
    at passBackControl (<...>\web-app\b4\node_modules\passport-google-oauth2\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:124:9)
    at IncomingMessage.<anonymous> (<...>\web-app\b4\node_modules\passport-google-oauth2\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7)
    at IncomingMessage.emit (events.js:129:20)
    at _stream_readable.js:908:16
    at process._tickCallback (node.js:355:11)
Run Code Online (Sandbox Code Playgroud)

相关应用程序的代码是:

  passport = require('passport'),
  //...
  GoogleStrategy = require('passport-google-oauth2').Strategy; // #passport-google-oauth2
  //...
  /***** #passport-google-oauth2 vv *****/
  passport.use(new GoogleStrategy({
    clientID: "a_specific_value",
    clientSecret: "another_specific_value",
    callbackURL: "http://127.0.0.1:3000/auth/google/callback",
    passReqToCallback:true
  },
  function(request, accessToken, refreshToken, profile, done) { …
Run Code Online (Sandbox Code Playgroud)

node.js express google-oauth2

19
推荐指数
2
解决办法
9999
查看次数

Google登录API挂起未捕获错误无法从URL哈希获取父源

我使用谷歌登录JavaScript客户端几个月没有问题.但最近当用户点击添加到主屏幕的webapp登录按钮时,登录弹出窗口只是挂起而没有显示任何内容.

通过远程调试进行调试时,控制台窗格中会显示错误:

Uncaught Failed to get parent origin from URL hash!
Run Code Online (Sandbox Code Playgroud)

源自4188232449-v2-idpiframe.js:136(由谷歌库内部加载的javascript).

我确定这不是编程/配置错误,因为同一个webapp以前工作了几个月没有问题,我没有修改任何代码.

我已尝试谷歌搜索此特定问题并浏览Google文档,了解Google登录API中的任何最新更改,但没有任何运气.

它是来自Google API Javascript客户端库的错误,来自Android上最近的Chrome浏览器更新的故障,还是我还不知道API使用方面的一些变化?

使用的库是https://apis.google.com/js/platform.js

这是gapi.auth2.init()的init参数:

{
  client_id: GAPI_CID,  // defined as constant
  cookiepolicy: 'single_host_origin',
  prompt: 'select_account',
  ux_mode: 'popup',
  fetch_basic_profile: true
}
Run Code Online (Sandbox Code Playgroud)

任何见解都将非常感激.谢谢.

PS:此问题与Uncaught不同,无法从URL哈希获取父源,因为在这种情况下,问题是由于 Google API控制台中所需凭据配置错误导致的.如果您从来没有成功将登录流程与您的应用程序集成,那么该帖子的回答可能会对您有所帮助.

否则,如果您已成功整合登录流程一段时间,但最近出现问题突然/不规律地出现在弹出窗口的空白屏幕症状,而不是您遇到同样的问题.

javascript google-api google-oauth2 google-signin

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

使用Google会话和帐户选择器的移动应用浏览器的行为

问题:尝试在移动应用之间创建SSO.和浏览器.

我们有什么:

我们有一个离子移动应用程序.使用OAuth 2.0身份验证"使用Google登录".我们有多个内部应用程序可以在OAuth2和SAML上运行,因此我们为GSuite启用了SSO,以便所有应用程序可以使用一个登录名和密码无缝地工作.现在,当我们点击"使用Google登录"按钮时,

  1. 在浏览器应用中打开SSO登录页面.我们启用了SSO,因此我们设置了login_hint,这有助于我们直接将我们带到SSO登录页面.

  2. 用户输入useremail和password,并在使用OAuth 2代码参数成功进行身份验证后重定向到redirect_uri.

  3. redirect_uri是以一种方式完成的,当url被触发时,它会再次使用OAuth 2代码param重定向回我们的Android应用程序,然后我们从token和userinfo端点提取access_token和useremail.

  4. 根据授权,仪表板显示指向我们内部应用程序的链接.适用于Google SAML 2.0或OAuth2身份验证.

预期结果:

当用户点击移动应用中的任何SAML/OAuth 2链接时.仪表板,我们在浏览器应用程序中打开该链接.它应该自动登录到该应用程序.并将我们带到目标网页,因为我们已经在步骤#a中设置了Google会话.

偏离预期的事情:

  • 当我们尝试访问SAML/OAuth应用时,当Chrome浏览器中设置了一个配置文件时,它会显示帐户选择器,其中列出了设备中同步的所有帐户,但没有列出用#b登录的用户.它应该显示该帐户或直接登录并显示登录页面.当我们没有设置chrome配置文件时,它就不会发生.
  • 当我们执行以下操作时,所有浏览器中的会话都会自动终止,因此会再次请求凭据.
    • 关闭浏览器选项卡(有时).
    • 从最近的应用程序托盘清除浏览器(大多数时间)
    • 重启设备(总是)

想要了解如何以及何时在手机中的谷歌浏览器中自动创建和杀死会话?

有什么地方保持会话完整吗?|有没有办法再通过显示与手机同步的帐户的帐户选择器?

更新

能够找出奇怪的观察结果:我们保持SSO关闭,以便谷歌登录屏幕出现.有了这一切一切正常.即使重新启动浏览器或手机,无论Android还是iOS,都不会终止会话.

所以问题在于我们设计的SSO.无法确定我们发布到Google的ACS网址的SAML XML中要设置的内容.

android google-chrome single-sign-on ios google-oauth2

17
推荐指数
1
解决办法
1778
查看次数

如何从Credential对象获取用户ID令牌?

我一直在关注教程,将Google登录支持包含在我的桌面应用中.我正在使用的图书馆是这个.

一切正常,这是authorize()方法的实现:

public Credential authorize() throws IOException {
    // Load client secrets.
    InputStream in = GoogleLogin.class.getResourceAsStream("/google/client_secret.json");
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(DATA_STORE_FACTORY)
            .setAccessType("offline")
            .build();

    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");

    System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
    return credential;
}
Run Code Online (Sandbox Code Playgroud)

但是,从一个Credential对象,我只能通过调用来检索访问令牌Credential.getAccessToken(),但我需要的是id token.如何在用户通过身份验证后从用户检索id_token?

java google-api-java-client google-oauth2

17
推荐指数
1
解决办法
1626
查看次数

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万
查看次数

如何使用curl直接获取Google OAuth 2.0 Access令牌?(不使用谷歌库)

我正在尝试按照教程使用他们的OAuth 2.0 API对Google进行身份验证.但是,我想直接curl打电话而不是使用他们的库.

我已获得客户端ID和客户端密钥.现在我正在尝试获取这样的访问令牌:

curl \
--request POST \
--header "Content-Type: application/json" \
--data '{
  "client_id":"MY_CLIENT_ID",
  "client_secret":"MY_SECRET_KEY",
  "redirect_uri": "http://localhost/etc",
  "grant_type":"authorization_code"
}' \
"https://accounts.google.com/o/oauth2/token"
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用.它给了我以下错误:

{
  "error" : "invalid_request",
  "error_description" : "Required parameter is missing: grant_type"
}
Run Code Online (Sandbox Code Playgroud)

有人可以请我提供样本卷曲调用以获取访问令牌(和刷新令牌)吗?

curl google-api oauth-2.0 google-oauth2

16
推荐指数
2
解决办法
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
查看次数

在嵌入式Android设备上使用Google OAuth 2

我们有基于Android的嵌入式设备的应用程序,它使用WebView,在其中我们使用Google OAuth 2登录应用程序.不幸的是,谷歌很快就会在WebView中阻止OAuth 2,我们有很多限制:

  • 该设备没有安装Google服务,因此可能没有"官方"登录方式可行(或者如果没有Google服务,其中任何一种都可以使用?)
  • 我们不能只是调用Android浏览器来登录,因为它显示地址栏,这将允许用户上网,我们不能允许
  • 我们无法完全控制设备上安装的软件:无法安装Google服务,更新Android版本,安装Google Chrome等等,我们只需更新我们的应用即可.

我们还能做些什么限制呢?

android oauth oauth-2.0 google-oauth google-oauth2

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

Google Drive API客户端(Python):文件权限不足().insert()

我正在尝试使用简单的Python Google Drive上传器.我在开发人员控制台中创建了一个项目,启用了Drive API并添加了OAuth 2.0客户端ID(应用程序类型为Other).

我可以看到Google云端硬盘的设置 - >管理应用中列出的应用,并且可以成功执行来自Google的Python Drive API客户端提供的许多操作.files().insert()但是失败了:

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart&convert=false&useContentAsIndexableText=false&alt=json returned "Insufficient Permission">
Run Code Online (Sandbox Code Playgroud)

这是为了插入到我已经写给每个人的目录中,如下所示:

credentials = get_credentials ()
http = credentials.authorize (httplib2.Http ())
service = discovery.build ('drive', 'v2', http=http)

PARENT_ID="0B1gLgXwTiUzlfmo0UGVsZ1NWdW1nZG9OcENNYkJua2E1d0pqWE14TjFyc2hVMHdEU1h5czQ"

perms = service.permissions().list(fileId=PARENT_ID).execute()

print ("PERMISSIONS:")
for perm in perms["items"]:
    for p in perm:
        print (p, perm[p])

print

parent = {
    "isRoot": False,
    "kind": "drive#parentReference",
    "id": PARENT_ID
}

service.files ().insert (
    body = {"parents" : [parent]},
    media_body='./test.txt',
    convert=False,
    useContentAsIndexableText=False
).execute ()
Run Code Online (Sandbox Code Playgroud)

其中列出的权限为:

(u'withLink', True)
(u'kind', …
Run Code Online (Sandbox Code Playgroud)

python oauth google-api google-drive-api google-oauth2

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

使用Android帐户登录网站

我正在构建一个响应式Web应用程序.它使用谷歌的oauth登录,它工作得很好(带有passportjs的nodejs).

当从Android手机浏览网站并按"登录"时,我将获得谷歌登录页面,就像使用桌面时一样.

是否可以使用Android中的Google帐户而不是强制用户输入其凭据?

android node.js passport.js google-oauth2

14
推荐指数
1
解决办法
251
查看次数