我被委托基于firebase为Android应用程序构建Web界面。我有一些与数据库交互的端点(Cloud functions)。要访问这些端点,我需要使用电子邮件和密码对用户进行身份验证[1],检索accessToken[2],并使用
我使用php,并且很难理解如何在我的应用程序中管理经过身份验证的用户。
简而言之,请查看我在php中的最终解决方案。https://dev59.com/mK3la4cB1Zd3GeqPStDC#52119600 我通过ajax在php会话中传输accessToken,以签署cURL请求到端点。显然,没有其他方法可以使用firebase JS auth(据我所知[4])。
我的问题是:仅将
编辑:一个用户指出,使用JWT令牌的经典php会话没有太多意义,我研究了这个主题。因此,关于Firebase - 这是需要考虑的东西吗?https://firebase.google.com/docs/auth/admin/manage-cookies
1. 登录页面
如Firebase示例中所述[3]
注意:我知道这个sdk https://github.com/kreait/firebase-php,我在那里阅读了很多问题和在SO上的帖子,但是我感到困惑,因为有谈论完全管理员权限等内容,而我只与建立在Firebase之上的端点进行交互(加上Firebase身份验证和Firestore)。而且我仍然在使用php 5.6 :-/。
感谢您的时间!
[1]:https://firebase.google.com/docs/auth/web/password-auth [2]:https://firebase.google.com/docs/reference/js/firebase.User#getIdToken [3]:https://github.com/firebase/quickstart-js/blob/master/auth/email-password.html [4]:https://github.com/kreait/firebase-php/issues/159#issuecomment-360225655
Authorization: Bearer {accessToken}
标头授权每个请求到端点。我使用php,并且很难理解如何在我的应用程序中管理经过身份验证的用户。
简而言之,请查看我在php中的最终解决方案。https://dev59.com/mK3la4cB1Zd3GeqPStDC#52119600 我通过ajax在php会话中传输accessToken,以签署cURL请求到端点。显然,没有其他方法可以使用firebase JS auth(据我所知[4])。
我的问题是:仅将
accessToken
保存在php会话中,并通过ajax POST请求与每个页面加载进行比较是否足够?处理php的更强大的策略是什么?编辑:一个用户指出,使用JWT令牌的经典php会话没有太多意义,我研究了这个主题。因此,关于Firebase - 这是需要考虑的东西吗?https://firebase.google.com/docs/auth/admin/manage-cookies
以下是我的内容:Firebase Auth为依赖于会话cookie的传统网站提供服务器端会话cookie管理。与可能需要重定向机制才能在到期时更新会话cookie的客户端短暂ID令牌相比,此解决方案具有几个优点:
1. 登录页面
如Firebase示例中所述[3]
function initApp() {
firebase.auth().onAuthStateChanged(function (user) {
if (user) {
// User is signed in.
// obtain token, getIdToken(false) = no forced refresh
firebase.auth().currentUser.getIdToken(false).then(function (idToken) {
// Send token to your backend via HTTPS
$.ajax({
type: 'POST',
url: '/auth/check',
data: {'token': idToken},
complete: function(data){
// data = {'target' => '/redirect/to/route'}
if(getProperty(data, 'responseJSON.target', false)){
window.location.replace(getProperty(data, 'responseJSON.target'));
}
}
});
// ...
}).catch(function (error) {
console.log(error);
});
} else {
// User Signed out
$.ajax({
type: 'POST',
url: '/auth/logout',
complete: function(data){
// data = {'target' => '/redirect/to/route'}
if(getProperty(data, 'responseJSON.target', false)){
// don't redirect to itself
// logout => /
if(window.location.pathname != getProperty(data, 'responseJSON.target', false)){
window.location.replace(getProperty(data, 'responseJSON.target'));
}
}
}
});
// User is signed out.
}
});
}
window.onload = function () {
initApp();
};
2. 一个PHP控制器来处理认证请求
public function auth($action)
{
switch($action) {
// auth/logout
case 'logout':
unset($_SESSION);
// some http status header and mime type header
echo json_encode(['target' => '/']); // / => index page
break;
case 'check':
// login.
if(! empty($_POST['token']) && empty($_SESSION['token'])){
// What if I send some bogus data here? The call to the Endpoint later would fail anyway
// But should it get so far?
$_SESSION['token'] = $_POST['token'];
// send a redirect target back to the JS
echo json_encode(['target' => '/dashboard']);
break;
}
if($_POST['token'] == $_SESSION['token']){
// do nothing;
break;
}
break;
}
}
3. 主控制器
// pseudo code
class App
{
public function __construct()
{
if($_SESSION['token']){
$client = new \GuzzleHttp\Client();
// $user now holds all custom access rights within the app.
$this->user = $client->request(
'GET',
'https://us-centralx-xyz.cloudfunctions.net/user_endpoint',
['headers' =>
[
'Authorization' => "Bearer {$_SESSION['token']}"
]
]
)->getBody()->getContents();
}else{
$this->user = null;
}
}
public function dashboard(){
if($this->user){
var_dump($this->user);
}else{
unset($_SESSION);
// redirect to '/'
}
}
}
注意:我知道这个sdk https://github.com/kreait/firebase-php,我在那里阅读了很多问题和在SO上的帖子,但是我感到困惑,因为有谈论完全管理员权限等内容,而我只与建立在Firebase之上的端点进行交互(加上Firebase身份验证和Firestore)。而且我仍然在使用php 5.6 :-/。
感谢您的时间!
[1]:https://firebase.google.com/docs/auth/web/password-auth [2]:https://firebase.google.com/docs/reference/js/firebase.User#getIdToken [3]:https://github.com/firebase/quickstart-js/blob/master/auth/email-password.html [4]:https://github.com/kreait/firebase-php/issues/159#issuecomment-360225655