使用Firebase委派的Auth0

时间:2015-08-07 13:52:05

标签: firebase firebase-security auth0 firebase-authentication

使用firebase委派进行Auth0登录

.controller('LoginCtrl', function($scope, auth, $state, store) {
      auth.signin({
        authParams: {
          // This asks for the refresh token
          // So that the user never has to log in again
          scope: 'openid offline_access',
          // This is the device name
          device: 'Mobile device'
        },
        // Make the widget non closeable
        standalone: true
      }, function(profile, token, accessToken, state, refreshToken) {
        // Login was successful
        // We need to save the information from the login
        store.set('profile', profile);
        store.set('token', token);
        store.set('refreshToken', refreshToken);
        auth.getToken({
          api: 'firebase'
        }).then(function(delegation) {
          store.set('firebaseToken', delegation.id_token);
          $state.go('app.categories');
        }, function(error) {
          console.log("There was an error getting the firebase token", error);
        })
      }, function(error) {
        console.log("There was an error logging in", error);
      });
    })

Auth0处的规则将适当的uid分配给令牌的委托部分:

function (user, context, callback) {
  var isFirebase = context.request.body.api_type === "firebase";
  if (context.isDelegation && isFirebase) {
    console.log(user.user_id);
    var uid = user.user_id;
    var provider = uid.split("|")[0];
    var id = uid.substring(uid.indexOf("|") + 1);
    user.firebase_data = {
      uid: provider + ":" + id
    };
  }
  return callback(null, user, context);
}

证明令牌为uid(正如解码令牌中firebase所预期的那样)

{
  "iss": "https://gitreport.auth0.com/",
  "sub": "facebook|10153081497714658",
  "aud": "ZCCZrJ0ggUrk67ePh2UgHSl9FKfpMlcS",
  "exp": 1438989556,
  "iat": 1438953556,
  "v": 0,
  "d": {
    "fb_id": "facebook|10153081497714658",
    "uid": "facebook:10153081497714658"
  },
  "azp": "ZCCZrJ0ggUrk67ePh2UgHSl9FKfpMlcS"
}

尝试使用UID写入Firebase中的/ users / $用户:ie / users / facebook | 34234234规则:

{
    "rules": {
      "users": {
        "$user_id": {
          // grants write access to the owner of this user account
          // whose uid must exactly match the key ($user_id)
          ".write": "$user_id === auth.uid"
        }
      },
      "salt" : {
       ".read" : true,
       ".write" : false
      },
      "categories" : {
       ".read" : true,
       ".write" : false
      },
        ".read": true,
        ".write": false
    }
}

不幸的是,我似乎无法调试在firebase端发生的事情。我的理解是Firebase期望在Firebase令牌的委托对象中使用uid,但是非常感谢这里的任何帮助。

当我用相应的用户信息交换auth.uid(在Firebase规则上)时,信息会被写入,所以我有信心如果我能以某种方式将正确的uid传递给令牌中的firebase,这将全部落空到位。

是的,我打算使用:而不是|对于uid中的分隔符。这是基于Firebase的期望。

加藤问题的答案:

@Kato Auth0使用委托的概念生成Firebase令牌。该令牌存储在客户端的浏览器中。解码时,令牌看起来像上面发布的块(证明令牌包含一个uid ......)firebase文档指出uid是provider:id,但是,你发送给我的最后一篇文章表明uid只是一个唯一生成的字符串。

我想我不明白auth0的责任从哪里开始,firebase的结束了?为什么我甚至需要委托auth0中的令牌呢?我是否应该对firebase进行完全独立的调用以生成令牌?如何处理Auth0创建的firebase令牌?

对我来说真正有趣的是,Auth0和Firebase人员似乎都不理解我所问的问题,也许是因为我没有以正确的方式提出这个问题。

从根本上说,我只想使用Auth0对用户进行身份验证,然后让Firebase在数据库中保护端点。

1 个答案:

答案 0 :(得分:5)