我试图为我的Firebase应用程序提供谷歌登录。在https://www.firebase.com/docs/security/simple-login-overview.html
似乎在成功登录后,可以获得一个用户,因此它可以被存储在Angular作用域中,例如$scope. loggedinuser。(取决于你的实现,不一定是Angular)
我的问题是,这是一个安全风险,由Firebase返回的用户与大量的身份验证令牌可以暴露?代码是用Javascript编写的,黑客应该可以通过在浏览器中嵌入一些代码来劫持和窃取用户。
引起我关注的位是:accessToken, firebaseAuthToken
如果这是一种风险,我们如何保护它?
请参考以下代码获取认证和用户数据:
下面是验证代码:authModule.controller( 'AuthController', [
'$scope',
'$firebase',
function ( $scope, $firebase ) {
var ref = new Firebase( 'https://test123.firebaseio.com' );
var auth = new FirebaseSimpleLogin( ref, function ( error, user ) {
if ( user ) {
$scope.loggedInUser = user; // user has authenticated, this user contains security information
}
} );
$scope.login = function () {
auth.login( "google", {
scope: 'https://www.googleapis.com/auth/plus.login'
} );
};
}] );
loggedInUser中包含的内容(这只是示例数据):
loggedInUser: {
id: 7058267704789236427849
uid: google:7058267704789236427849
displayName: Joe Bloggs
provider: google
thirdPartyUserData: {
id: 709139364278942374
email: test@gmail.com
verified_email: true
name: Joe Bloggs
given_name: Joe
family_name: Bloggs
link: https://plus.google.com/2672340913423423
picture: https://lh3.googleusercontent.com/.../photo.jpg
gender: male
locale: en-GB
}
accessToken: W8k8dD6vvLEdlWa-dxkJD8lvWIwzea6m_86um8...
email: test@gmail.com
firebaseAuthToken: Q3Mjc4MzYsInYiOjAsImQiOnsiaWQiOiIxMDk0...
}
这基本上是一个关于OAuth及其操作方式的问题。加密令牌的生成是此过程的基础。关于是否以及在哪里可以存储这个令牌(cookie、本地存储、内存等),有很多意见。
令牌安全吗?在SSL会话中使用OAuth是非常安全的。Firebase使用与其他大公司相同的OAuth实践和加密,所有这些公司都以类似的方式提供OAuth令牌(事实上,在Simple Login中,您可以获得您的Facebook auth令牌,例如,作为登录有效载荷的一部分,就像它通过Facebook的API给我们一样)。
这并不是说OAuth没有缺点。在安全问题上没有完美的答案,因为一切都是一种权衡。唯一完全安全的系统是物理上不存在的,不连接任何网络,也不能被人类访问的系统。
关于XSS等:本质上,一旦巨魔进入城堡,瓷器就会被打破。如果客户端受到威胁,那么就没有什么是安全的了。如果用户设法以某种方式破坏您的客户端浏览器或执行成功的XSS,那么他们可以通过多种方式访问您的帐户,无论我们谈论的是OAuth令牌还是普通的登录/密码字段。
总之,如果您相信Google、Facebook、Twitter、Yahoo和M$身份验证是相对安全的,那么您也可以对Firebase身份验证模式抱有同样的信心。
为了给我自己的问题提供更多的答案,以便对遇到同样问题的其他人有益,我尝试登录,注销,再次登录。每次我得到不同的令牌(对于两者:accessToken, firebaseAuthToken)。所以这些令牌就像sessionId一样,会在注销时过期。
找到了来自Firebase的Andrew Lee的答案。他解释说,令牌是有时间限制的,可以保存在浏览器的localStorage中(这就是我们想要维护活动会话的方式)。
请参考:https://stackoverflow.com/a/14094165/2810746