使用PHP进行身份验证的Firebase REST访问
我正在尝试使用
PHP,Google Auth library以及Firebase的REST的
wrapper从服务器访问Firebase …这很有助于实现这一点:
use FirebaseJWTJWT; use GoogleAuthCredentialsServiceAccountCredentials; use GoogleAuthHttpHandlerHttpHandlerFactory; use GuzzleHttpClient; $email = 'account@email.com'; $key = 'private_key_goes_here'; $scopes = [ 'https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/firebase.database',]; $creds = [ 'client_email' => $email,'private_key' => $key,]; $serviceAccount = new ServiceAccountCredentials($scopes,$creds); $handler = HttpHandlerFactory::build(new Client()); $token = $serviceAccount->fetchAuthToken($handler); $firebase = new FirebaseFirebaseLib($url,$token); $value = $firebase->get('test/hello'); # $value now stores "world" 但是,这需要Firebase中的安全规则是通用读/写,这是我不想要的.如果我将安全规则更新为: { "rules": { "test": { ".read": "auth != null" } } } $value的结果变为{“error”:“Permission denied”}.我进行了广泛的搜索,并尝试了许多排列和可能的解决方案,没有确定的结果. 我已经使用this code向最终客户端提供JWT令牌,这些客户端可以成功使用它们并且可以毫无问题地利用安全规则.我最初为服务器尝试了相同的方法,但没有成功.我选择尝试将两种方法结合起来: # Snipping code that didn't change... $serviceAccount = new ServiceAccountCredentials($scopes,$creds); $handler = HttpHandlerFactory::build(new Client()); $payload = [ 'iss' => $email,'sub' => $email,'aud' => 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit','iat' => time(),'exp' => time() + 60 * 60,'uid' => '123','claims' => [ 'uid' => '123',],]; $payload = $serviceAccount->updateMetadata($payload); $token = JWT::encode($payload,$key,'RS256'); $firebase = new FirebaseFirebaseLib($url,$token); $value = $firebase->get('test/hello'); 这似乎接近了,但$value现在包含{“error”:“在auth标题中缺少声明’孩子’.”}.为了解决这个问题,我修改了编码调用: $token = JWT::encode($payload,'RS256','key_id_goes_here'); 这导致了一个稍微不同的错误:在auth标题中无效声明’kid’,表明我在正确的轨道上…但不完全在那里.直接使用JWT令牌会产生完全相同的结果.我有什么想法我做错了吗?电子邮件,私钥和密钥ID都直接来自我创建服务帐户时提供的json凭证文件. 我查看了几十页的文档和帖子,以下是最有帮助的: > Using JWT for Server Auth (Firebase Docs) Cross发布到Firebase Google Group. 解决方法
使用将成为安全规则中的auth变量的服务帐户进行身份验证时,可以指定auth_variable_override查询参数.它应该是一个正确转义的JSON对象.例如要做{“uid”:123}你要添加:
?auth_variable_override=%7B%22uid%22%3A%22123%22%7D 到请求URL的末尾. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |