带有Google电子邮件范围的Firebase Angular OAuth,auth。$ authWithOAuthPopup vs ref.authWithOAuthPopup

时间:2015-02-18 18:01:17

标签: angularjs oauth angularfire

我成功使用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。

3 个答案:

答案 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'});
  }