Google帐户关联操作

根据此处描述的文档,我将帐户链接设置为隐式授权,并发现在使用浏览器/操作控制台进行测试时,以及使用适用于Android的Google Home应用程序时,它可以正常运行。 不幸的是,在应用程序的iphone版本中,用户auth大部分时间都会挂起。 来自谷歌支持的操作的反馈是,问题是谷歌登录流程是在单独的浏览器选项卡(窗口)中实现的。 在iPhone上,你无法在SfariViewController中打开2个窗口,因此它们正在重写第一页的地址,无法完成登录流程。 这是已知问题,他们不打算改变这一点。 解决方案是在一个浏览器窗口中实现登录流程。 我不清楚如何做到这一点,我正在寻找一个人在你设置的授权URL后面共享代码,这些代码在iphone上一致。 以下是我使用的核心内容:

.html片段:

   Authorization Page   <!--  INCLUDING THIS META TAG BREAKS THE AUTH FLOW -->        
Google Sign In
Sign in with your Google account



.js代码段:

 function onSignIn(googleUser) { var profile = googleUser.getBasicProfile(); var id = profile.getId() var name = profile.getName() var email = profile.getEmail() var token = googleUser.getAuthResponse().id_token; var client_id = getQueryVariable('client_id') // vital-code-16xxx1 is the project ID of the google app var redirect_uri = 'https://oauth-redirect.googleusercontent.com/r/vital-code-16xxx1' var state = getQueryVariable('state') var response_type = getQueryVariable('response_type') // store the user's name, ID and access token and then sign out storeOwnerID (email, name, id, token, function() { // sign out var auth2 = gapi.auth2.getAuthInstance(); auth2.signOut().then(function () { console.log('signed out') }); // if this page was loaded by Actions On Google, redirect to complete authorization flow typeof redirect_uri != 'undefined' ? window.location = redirectURL : void 0 }) } function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } console.log('Query variable %s not found', variable); } 

@dana您是否尝试过添加元标记?

  

在Google支持和工程的帮助下,现在已解决此问题:

  1. 如上所述,我必须包含此元标记:
  2. 我需要在项目的授权重定向URI中使用https://my-auth-endpoint.com/ 。 仅在授权的javascript起源中使用它是不够的。 另一个关键的事情是包括尾部斜杠,我原本没有,没有它就无法工作。

下面是一个简单的代码基础,您可以使用该基础为Google帐户关联操作获取授权终结点的工作版本:

html的:

    Authorization Page            
Google Sign In
Sign in with your Google account



.js文件:

 // Retrieve user data, store to DynamoDB and complete the redirect process to finish account linking function onSignIn(googleUser) { let profile = googleUser.getBasicProfile(), id = profile.getId(), name = profile.getName(), email = profile.getEmail(), token = googleUser.getAuthResponse().id_token, redirect_uri = 'https://oauth-redirect.googleusercontent.com/r/vital-code-16xxxx', jsonData = JSON.parse(sessionStorage['jsonData']), redirectURL = redirect_uri + '#access_token=' + token + '&token_type=bearer&state=' + jsonData.state // store the user's name, ID and access token storeUserData(email, name, id, token, function() { // sign out of google for this app let auth2 = gapi.auth2.getAuthInstance(); auth2.signOut() // if this page was loaded by Actions On Google, redirect to complete authorization flow typeof redirect_uri != 'undefined' ? window.location = redirectURL : void 0 }) } // Store the user data to db function storeUserData (email, name, id, token, callback) { // removed for simplicity } // Store URI query variable 'state' to browser cache function storeQueryVariables() { let qvar = { 'state': getQueryVariable('state') } storeLocally(qvar) } // Get any variable from incoming URI function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } console.log('Query variable %s not found', variable); } // Store JSON object input to local browser cache function storeLocally (jsonData) { if (typeof(Storage) !== 'undefined') { sessionStorage['jsonData'] = JSON.stringify(jsonData) } else { console.log('Problem: local web storage not available') } }