"#immediate_failed 34; - 无法自动登录用户

时间:2013-04-07 14:14:18

标签: web google-plus

我在使用Google+登录开发网站时出现问题: 我一步一步地告诉医生,但我总是在第4步失败: https://developers.google.com/+/web/signin/

结果总是“”immediate_failed“ - 无法自动登录用户”,我只是不知道为什么,任何人都可以帮助我,非常感谢! : - (

5 个答案:

答案 0 :(得分:21)

请注意,在您指向的示例代码中,“immediate_failed”检查已被注释掉。这是故意的,因为当用户第一次遇到页面上的登录按钮时,它将失败。

失败的原因是,当页面首次加载时,在用户按下按钮之前,会向Google发送请求,以确定用户是否已登录(例如,通过Google或其他网站)。如果是 - 他们不需要再次登录,因此永远不需要显示按钮。但如果他们已经已登录,您将收到“immediate_failed”响应,并且需要显示(或不清除)该按钮。

tl; dr - 当页面首次加载时,不要担心会立即失败。这很正常。

答案 1 :(得分:3)

作为一种解决方法,我在gapi.auth.signIn回调中使用gapi.auth.authorize方法。这是我的代码:

gapi.auth.signIn({
    'callback': gPlusLoginCallback
});

function gPlusLoginCallback(authResult) {
    if (authResult['status']['signed_in']) {
        doSmth(authRes['access_token']); 
    } else if (authResult['error'] == "immediate_failed") {
        gapi.auth.authorize({
            client_id: gplusClientId,
            scope: 'https://www.googleapis.com/auth/plus.login email',
            immediate: true
        }, function (authRes) {
            if (authRes['status']['signed_in']) {
                doSmth(authRes['access_token']);
            }
        });
    }
}

function doSmth(accessToken){
    //Do smth
}

答案 2 :(得分:2)

将此设置更改为“immediate:true”,将其设置为false“immediate:false”。 但是,如果您想进行更复杂的实现,请查看此处的第一个示例https://developers.google.com/api-client-library/javascript/start/start-js。您必须拨打Google的“gapi.auth.authorize({...”,第一个使用“immediate:true”,第二个使用“immediate:false”。

答案 3 :(得分:1)

在我的情况下,该错误是由于将authorization parameter $_ps = [Powershell]::Create() $_ps.RunspacePool = $_runspace_pool $null = $_ps.AddScript({ Param ( [Parameter(Mandatory = $true)] $ComputerName, [Parameter(Mandatory = $true)] $LibPath, [Parameter(Mandatory=$false)] $Logger = $null ) $ErrorActionPreference = 'SilentlyContinue' Import-Module -Name "$LibPath\MyObjectModule" -Force $_obj = MyObjectModule\New-MyObject if ( $Logger ) { $_obj.Logger = $Logger } $_obj.InvokeDiscovery($ComputerName) }) # end of $_ps.AddScript() # set script parameters $null = $_ps.AddParameters(@{ComputerName = $_computer; LibPath = $_lib_path; Logger = $_logger}) 明确指定为$_queue = some synchronized queue-like object $_logger = MyLoggerModule\New-MyLogger $_logger.queue = $_queue $_ps = [Powershell]::Create() $_ps.RunspacePool = $_runspace_pool $null = $_ps.AddScript({ Param ( [Parameter(Mandatory = $true)] $Queue, ... ) $ErrorActionPreference = 'SilentlyContinue' Import-Module -Name "$LibPath\MyObjectModule" -Force Import-Module -Name "$LibPath\MyLoggerModule" -Force $_obj = MyObjectModule\New-MyObject $_logger = MyLoggerModule\New-MyLogger $_logger.queue = $Queue $_obj.InvokeDiscovery($ComputerName) }) # end of $_ps.AddScript() # set script parameters $null = $_ps.AddParameters(@{ComputerName = $_computer; LibPath = $_lib_path; Queue = $_queue}) # wait for threads to complete do { $_logger.flush() Start-Sleep -seconds 5 } ( threads still running ) ,类似于先前的答案。

通过指定prompt或按照官方docs的规定对我有用,您可以跳过此参数。

答案 4 :(得分:0)

这个问题已经过时了,但我最近遇到了这个问题。

就我而言,是因为我将URI parameter prompt指定为none。如果用户以前从未登录过您的平台,我想谷歌不喜欢这样。

每当我将其更改为consent或完全删除它时,效果都很好。