使用 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 令牌的委托对象内的 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 保护数据库中的端点。