У меня была похожая проблема. Пользователи уже были зарегистрированы в моем приложении appengine и пользовательской модели (изначально из webapp2). Затем я мог бы добавить аутентификацию Firebase и затем сопоставить учетные данные из Firebase с моей моделью пользователя. Ниже приведен мой шаблон входа, если он может вам помочь (он использует flask framework с python 3 runtime):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>FirebaseUI</title>
<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/7.2.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.2.1/firebase-analytics.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.2.1/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.2.1/firebase-firestore.js"></script>
<script>
// Your web app's Firebase configuration
var firebaseConfig = {
apiKey: "0123456789apikey",
authDomain: "myappname.firebaseapp.com",
databaseURL: "https://myappname.firebaseio.com",
projectId: "myappname",
storageBucket: "myappname.appspot.com",
messagingSenderId: "01234567890",
appId: "1:01234567890:web:21ee025bb5fb02b11337",
measurementId: "F-ZZ34N242F8"
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
firebase.analytics();
</script>
<script src="https://cdn.firebase.com/libs/firebaseui/4.2.0/firebaseui.js"></script>
<link type="text/css" rel="stylesheet" href="https://cdn.firebase.com/libs/firebaseui/4.2.0/firebaseui.css"/>
<script type="text/javascript">
// FirebaseUI config.
var uiConfig = {
signInSuccessUrl: '/',
signInOptions: [
// Comment out any lines corresponding to providers you did not check in
// the Firebase console.
{
provider: firebase.auth.EmailAuthProvider.PROVIDER_ID,
signInMethod: firebase.auth.EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD
},
firebase.auth.GoogleAuthProvider.PROVIDER_ID,
//firebase.auth.EmailAuthProvider.PROVIDER_ID,
//firebase.auth.FacebookAuthProvider.PROVIDER_ID,
//firebase.auth.TwitterAuthProvider.PROVIDER_ID,
//firebase.auth.GithubAuthProvider.PROVIDER_ID,
//firebase.auth.PhoneAuthProvider.PROVIDER_ID
],
// Terms of service url.
tosUrl: 'https://www.example.com',
privacyPolicyUrl: function () {
window.location.assign('https://www.example.com');
}
};
// Initialize the FirebaseUI Widget using Firebase.
//var ui = new firebaseui.auth.AuthUI(firebase.auth());
// The start method will wait until the DOM is loaded.
//ui.start('#firebaseui-auth-container', uiConfig);
window.addEventListener('load', function () {
document.getElementById('sign-out').onclick = function () {
firebase.auth().signOut();
};
firebase.auth().onAuthStateChanged(function (user) {
// alert("statechanged")
if (user) {
//alert("user logged in")
// User is signed in, so display the "sign out" button and login info.
document.getElementById('sign-out').hidden = false;
document.getElementById('login-info').hidden = false;
console.log(`Signed in as (${user.email})`);
user.getIdToken().then(function (token) {
// Add the token to the browser's cookies. The server will then be
// able to verify the token against the API.
// SECURITY NOTE: As cookies can easily be modified, only put the
// token (which is verified server-side) in a cookie; do not add other
// user information.
document.cookie = "token=" + token;
});
} else {
// User is signed out.
// Initialize the FirebaseUI Widget using Firebase.
var ui = new firebaseui.auth.AuthUI(firebase.auth());
// Show the Firebase login button.
ui.start('#firebaseui-auth-container', uiConfig);
// Update the login state indicators.
document.getElementById('sign-out').hidden = true;
document.getElementById('login-info').hidden = true;
// Clear the token cookie.
document.cookie = "token=";
}
}, function (error) {
console.log(error);
alert('Unable to log in: ' + error)
});
});
</script>
</head>
<body>
<!-- The surrounding HTML is left untouched by FirebaseUI.
Your app may use that space for branding, controls and other customizations.-->
<h1>Welcome</h1>
<div id="firebaseui-auth-container"></div>
<button id="sign-out" hidden=true>Sign Out</button>
<div id="login-info" hidden=true>
<h2>Login info:</h2>
{% if user_data %}
<dl>
<dt>Name</dt>
<dd>{{ user_data['name'] }}</dd>
<dt>Email</dt>
<dd>{{ user_data['email'] }}</dd>
</dl>
{% elif error_message %}
<p>Error: {{ error_message }}</p>
{% endif %}
</div>
</body>
</html>
Тогда бэкэнд с python довольно легко получить объект учетных данных пользователя «заявки» (который будет JSON объект), который содержит адрес электронной почты, который можно сопоставить с профилем пользователя, уже находящимся в моем хранилище:
from google.oauth2 import id_token as gid_token
from flask import Flask, render_template, request, redirect, g
@app.before_request
def before_request_func():
id_token = request.cookies.get("token")
system_info = None
error_message = None
claims = None
if id_token:
try:
claims = gid_token.verify_firebase_token(
id_token, firebase_request_adapter)
g.friendly_id = claims.get('name', claims.get('email', 'Unknown'))
except ValueError as exc:
error_message = str(exc)
g.error_message = error_message # Make a list of errors
g.system_info = system_info
g.claims = claims
Теперь объект заявок доступен в любом обработчике запросов:
@app.route("/my-page.html")
def my_ads():
if g.claims is None:
return redirect(f"/login.html", code=302)
else:
claims = g.claims
email = claims.get("email")
...
Если у вас все еще есть проблемы и вы хотите попробовать описанное выше, я мог бы создать пример проекта, открытого на GitHub или подобном.