我正在尝试使用Facebook登录验证我的Firebase(Angularfire)应用的用户。
当我使用弹出式窗口进行身份验证时,一切都按预期工作,但支持尽可能多的浏览器(iOS上的Chrome不支持弹出式窗口,例如)我想使用重定向进行身份验证($authWithOAuthRedirect
)。
我已经证实了我在Facebook的设置是正确的(我的应用程序ID和秘密,对EG),但是当我在Facebook的一个重定向验证后重定向回我的应用程序,$onAuth
大火,但我没有我的Facebook authData
做。
相反,我有匿名authData
。有点背景;所有用户如果未经其他方式认证(例如在此例中为Facebook),则匿名认证。
我不明白为什么会这样 - 用户现在应该通过Facebook进行身份验证,并有Facebook authData
。我的代码
节选低于一些背景:
触发,当用户点击登录按钮
function logIn() {
firebaseAuth
.$authWithOAuthRedirect('facebook', function (error) {
if (error) {
console.log(error);
}
});
}
$onAuth
(在我的角度应用程序的run
)
function run ($rootScope, firebaseAuth, sessionStore) {
$rootScope
.$on('$routeChangeError', function (event, next, prev, error) {
if (error === 'AUTH_REQUIRED') {
console.log(error);
}
});
$rootScope
.$on('$routeChangeSuccess', function (event, current, prev) {
$rootScope.title = current.$$route.title;
});
firebaseAuth
.$onAuth(onAuth);
function onAuth (authData) {
console.log(authData);
}
}
路由解析器t o否则匿名用户进行身份验证
function sessionState ($q, firebaseAuth) {
var deferred = $q.defer();
firebaseAuth
.$requireAuth()
.then(deferred.resolve, guest);
return deferred.promise;
function guest() {
firebaseAuth
.$authAnonymously()
.then(deferred.resolve, rejected);
}
function rejected() {
deferred.reject('AUTH_REQUIRED');
}
}
路由解析(sessionState
)检查是否用户已经通过身份验证,如果没有,尝试以匿名方式验证他们的身份。
在Facebook身份验证重定向之后,用户将已经通过身份验证,因此不需要进行匿名身份验证。
但是,看起来他们是?由于$onAuth
将authData
记录到控制台,并且它是匿名的。
任何与此有关的帮助将不胜感激!我相信它与我的路由解析器有关,因为弹出式身份验证正常工作(路由已经解决)。
编辑:我试图完全删除我的路由解析器,以防万一它是导致问题,但它没有区别。用户只是'未经认证',而不是通过Facebook(在$authWithOAuthRedirect
之后)或匿名认证。
更新:我尝试使用Twitter和重定向传输进行身份验证,并且遇到了完全相同的问题。我也尝试使用端口80,而不是端口3000,我的应用程序在本地服务,但没有喜悦。
UPDATE:当我关闭html5Mode
模式在我的应用程序 - 和路线现在#
s。开头 - $authWithOAuthRedirect
完美的作品。由此我只能假设$authWithOAuthRedirect
不支持AngularJS的html5Mode
。任何人都可以确认这是一个问题,或者我是否需要更改我的代码以支持html5Mode
和authWithOAuthRedirect
?
例REPO下面是一个例子演示回购问题:https://github.com/jonathonoates/myapp
照照dist
目录 - 你应该能够下载这个并运行应用程序来重现问题。在scripts/main.js
是应用程序的JS;我已经添加了一些评论,但它很自我解释。
重现问题:点击'Facebook登录'按钮,你会被重定向到Facebook进行身份验证。 FB将重定向你回到应用程序,但是,这里存在的问题 - 你会不会进行认证,并返回的authData将是空的 - 你会在控制台中看到这个
UPDATE:当我添加hashPrefix
in html5Mode
eg
$locationProvider
.html5Mode(true)
.hashPrefix('!');
的应用工程,我所期望的 - 与Facebook和重定向交通工程验证。
夫妇niggles的,但:
- 的URL已
#%3F
附加到它,并使用/在浏览器的历史记录中看到。 - 这会在不支持
History.pushState
(html5Mode
)的浏览器中重写网址#!
,而一些不太先进的搜索引擎可能会因为“hashbang”而寻找HTML片段。
我会考虑从Facebook重新导向而不是使用hashPrefix
来劫持URL。在URL中有一个__firebase_request_key
,这可能是重要的,例如,
http://localhost:3000/#%3F&__firebase_request_key=
乔纳森,你可以尝试下载2.4.0?一在那个版本中修复了哈希URL,我怀疑它会有帮助。 – Kato
然后,而不是代码摘录,我们将需要一个最小的repro。请参阅[创建一个mcve] – Kato
这里有一个MCVE让你看看 - 在这里,我已经验证了Facebook的重定向传输不能与'html5mode'打开。我还会用链接更新我的Q:https://github.com/jonathonoates/myapp –