同时开发的最后一个例子node.js中的入门书(一express.js使用谷歌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) 我使用谷歌登录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控制台中所需凭据配置错误导致的.如果您从来没有成功将登录流程与您的应用程序集成,那么该帖子的回答可能会对您有所帮助.
否则,如果您已成功整合登录流程一段时间,但最近出现问题突然/不规律地出现在弹出窗口的空白屏幕症状,而不是您遇到同样的问题.
问题:尝试在移动应用之间创建SSO.和浏览器.
我们有什么:
我们有一个离子移动应用程序.使用OAuth 2.0身份验证"使用Google登录".我们有多个内部应用程序可以在OAuth2和SAML上运行,因此我们为GSuite启用了SSO,以便所有应用程序可以使用一个登录名和密码无缝地工作.现在,当我们点击"使用Google登录"按钮时,
在浏览器应用中打开SSO登录页面.我们启用了SSO,因此我们设置了login_hint,这有助于我们直接将我们带到SSO登录页面.
用户输入useremail和password,并在使用OAuth 2代码参数成功进行身份验证后重定向到redirect_uri.
redirect_uri是以一种方式完成的,当url被触发时,它会再次使用OAuth 2代码param重定向回我们的Android应用程序,然后我们从token和userinfo端点提取access_token和useremail.
根据授权,仪表板显示指向我们内部应用程序的链接.适用于Google SAML 2.0或OAuth2身份验证.
预期结果:
当用户点击移动应用中的任何SAML/OAuth 2链接时.仪表板,我们在浏览器应用程序中打开该链接.它应该自动登录到该应用程序.并将我们带到目标网页,因为我们已经在步骤#a中设置了Google会话.
偏离预期的事情:
想要了解如何以及何时在手机中的谷歌浏览器中自动创建和杀死会话?
有什么地方保持会话完整吗?|有没有办法再通过显示与手机同步的帐户的帐户选择器?
更新
能够找出奇怪的观察结果:我们保持SSO关闭,以便谷歌登录屏幕出现.有了这一切一切正常.即使重新启动浏览器或手机,无论Android还是iOS,都不会终止会话.
所以问题在于我们设计的SSO.无法确定我们发布到Google的ACS网址的SAML XML中要设置的内容.
我一直在关注本教程,将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?
我正在开发一个应用程序,我需要访问多个谷歌日历.所有这些日历都来自不同的用户.现在我正在使用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
我正在尝试按照本教程使用他们的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)
有人可以请我提供样本卷曲调用以获取访问令牌(和刷新令牌)吗?
我正在使用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
我们有基于Android的嵌入式设备的应用程序,它使用WebView,在其中我们使用Google OAuth 2登录应用程序.不幸的是,谷歌很快就会在WebView中阻止OAuth 2,我们有很多限制:
我们还能做些什么限制呢?
我正在尝试使用简单的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) 我正在构建一个响应式Web应用程序.它使用谷歌的oauth登录,它工作得很好(带有passportjs的nodejs).
当从Android手机浏览网站并按"登录"时,我将获得谷歌登录页面,就像使用桌面时一样.
是否可以使用Android中的Google帐户而不是强制用户输入其凭据?
google-oauth2 ×10
google-api ×5
android ×3
oauth ×3
google-oauth ×2
node.js ×2
oauth-2.0 ×2
c# ×1
curl ×1
express ×1
ios ×1
java ×1
javascript ×1
passport.js ×1
python ×1