我成功使用Firebase的角度库来对Facebook和Google授权用户,但是在使用firebaseAuth的$ authWithOAuthPopup时,我很难找到用户的电子邮件。
这是我的登录功能。
var ref = new Firebase(FIREBASE_URL);
var auth = $firebaseAuth(ref);
loginGoogle: function () {
console.log('Logging in Google.');
return auth.$authWithOAuthPopup('google', function(error, user){
//TODO: Handle Failed login better
console.log('Google login failed');
console.log(error);
},{
scope: 'email'
});
};
这将弹出google auth窗口并成功登录。但是,在访问权限窗口中,它不会请求“电子邮件”范围访问。
如果我使用ref.authWinOAuthPopup(...)而不是auth。$ authWithOAithPopup(...)它会正确请求电子邮件烫发,并在验证后传递该信息。
我在这里做错了吗?或者,这是我应该报告的Angularfire错误吗?
Angularfire v0.9.2。
答案 0 :(得分:0)
进一步挖掘之后,我发现$ firebaseAuth。$ authWithOAuthPopup只接受两个参数(provider和options),而Firebase.authWithOAuthPopup接受三个(provider,onComplete回调,选项)。因此,使用重构来使用返回的promise而不是传入回调函数来解决问题。
答案 1 :(得分:0)
为了更清楚,我想添加我的代码段以显示如何将电子邮件范围传递给google oAuth。
正如您所提到的,如果您使用承诺进行身份验证而不是回调,则可以将电子邮件范围的选项传递给身份验证。作为第二个参数调用,然后电子邮件地址将在有效负载中可用。
请查看以下代码段:
$scope.loginGoogle = function() {
Auth.$authWithOAuthPopup("google", {scope: ['email']}).then(function(authData) {
// handle authData in onAuth handler in app.js in run method with Auth.$onAuth(function(authData) { ... });
console.log("Authenticated successfully with payload:", authData);
$location.path(REDIRECT_ROUTE);
})
.catch(function(err) {
$scope.err = errMessage(err);
});
};
function errMessage(err) {
var msg = "";
//return angular.isObject(err) && err.code? err.code : err + '';
switch (err.code) {
case "INVALID_EMAIL":
case "INVALID_PASSWORD":
case "INVALID_USER":
console.log("The specified user account email is invalid.");
msg = "E-mail or password is invalid.";
break;
/*
case "INVALID_PASSWORD":
console.log("The specified user account password is incorrect.");
break;
case "INVALID_USER":
console.log("The specified user account does not exist.");
break;
default:
// password or email empty;
console.log("Error logging user in:", err);*/
};
return msg;
}
angular.module('firebase.auth', ['firebase', 'firebase.utils'])
.factory('Auth', ['$firebaseAuth', 'fbutil', function($firebaseAuth, fbutil) {
return $firebaseAuth(fbutil.ref());
}]);
答案 2 :(得分:0)
这就是我所做的,它对我有用
.config(function ($firebaseRefProvider) {
$firebaseRefProvider.registerUrl('https://****.firebaseio.com/');
})
然后在控制器中
loginWithGoogle: function(){
var ref = $firebaseRef.default;
ref.authWithOAuthPopup("google", function(error, authData) {
if (error) {
...
} else {
console.log(authData.google.email);
}
},{scope: 'email'});
}