Auth0 与 Firebase 委托

Posted

技术标签:

【中文标题】Auth0 与 Firebase 委托【英文标题】:Auth0 with Firebase Delegation 【发布时间】:2015-10-30 23:57:15 【问题描述】:

使用 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/$users:即 /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 保护数据库中的端点。

【问题讨论】:

当你提到这个:“当我用适当的用户信息换出 auth.uid(根据 Firebase 规则)时”,你用哪个 ID 替换它?你在硬编码“facebook:10153081497714658”吗? Auth0 不是已经提供了 Firebase 令牌作为选项吗?我很确定他们有 Firebase 集成。此外,尝试创建类似于 Firebase 内部实现 will lead to breakage 的 UID。 您从 Firebase 得到什么错误?您的 authWithOAuthToken() 或 authWithCustomToken() 调用在哪里? Auth0 是否也为您完成这部分工作?我认为不会。 @Kato Auth0 使用委托的概念来生成 Firebase 令牌。该令牌存储在客户端的浏览器上。解码后,令牌如下所示:` "iss": "gitreport.auth0.com", "sub": "facebook|10153081497714658", "aud": "ZCCZrJ0ggUrk67ePh2UgHSl9FKfpMlcS", "exp": 1438989556, "iat": 1438953556 ,“v”:0,“d”:“fb_id”:“facebook|10153081497714658”,“uid”:“facebook:10153081497714658”,“azp”:“ZCCZrJ0ggUrk67ePh2UgHSl9FKfpMlcS”` 这里是错误:FIREBASE WARNING: set at /users/facebook:10153081497714658/0/-JwJPCfwkBc5Zw4zOBWY failed: permission_denied 【参考方案1】:

我解决了并写在这里:http://billbutler1969.tumblr.com/post/126341320130/auth0-with-firebase-delegation-and-security-rules

【讨论】:

以上是关于Auth0 与 Firebase 委托的主要内容,如果未能解决你的问题,请参考以下文章

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba

Stripe 和 Firebase:FirebaseError:collection() 的第一个参数应为 CollectionReference、DocumentReference 或 Fireba

使用 auth0 Firebase 和 Ionic 进行 Linkedin 身份验证

我该如何解决这个问题:Android Studio - Flutter - Dart - firebase [关闭]

将Firebase存储与Google云CDN集成

如何将 Flutter Bloc 与 Firebase 电话身份验证一起使用