我在使用Google+登录开发网站时出现问题: 我一步一步地告诉医生,但我总是在第4步失败: https://developers.google.com/+/web/signin/
结果总是“”immediate_failed“ - 无法自动登录用户”,我只是不知道为什么,任何人都可以帮助我,非常感谢! : - (
答案 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
或完全删除它时,效果都很好。