firebase - 如何使用我的 Firebase 身份验证来处理外部服务?
问题描述
好的,所以我使用 firebase 作为我的 iOS 应用程序的身份验证。现在我计划使用称为 connectyCube 的外部服务向我的应用程序添加视频通话。该服务有自己的身份验证系统,除非用户经过身份验证,否则我无法使用他们的服务。
- 选项 1:我可以使用他们自己的身份验证,这意味着我的应用程序将有两个身份验证系统 - 效率不高
- 选项 2:他们说我可以使用现有的身份验证来验证用户
我知道这在开发人员世界中很常见,我看到 OAuth 和 JWT 这个词被抛出,但我是一名新手开发人员,我想了解如何使用 firebase 并从外部服务验证用户。
这些是他们在我选择“我有自己的身份验证”选项时提出的问题:
- 您的终点网址是什么
- 是 GET 还是 POST
- 请求标头
- 请求参数
- 响应参数
我在哪里可以从 firebase 获得所有这些信息?任何帮助都会很棒
解决方案
作为@Dharmaraj 答案的替代方案,您可以根据他们提供的代码示例为此使用HTTP 事件云函数。
使用此方法,您可以创建/verifyUserToken
ConnectyCube 使用的端点。
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp();
export const verifyUserToken = functions.https.onRequest((req, res) => {
const idToken = req.query.token;
verifyUser(idToken)
.then(
(userData) => {
res.status(200).json(userData)
},
(err) => {
console.log("Token verification failed.", err.code || err.message);
res.status(422).json({error: "User token is invalid"})
}
)
.catch((err) => console.error("Unexpected crash", err));
});
async function verifyUser(token) {
if (!token)
throw new Error("token missing");
// using `true` here to force token to be checked against the Firebase
// Auth API rather than trusting its contents as-is
const { uid, email } = await admin.auth().verifyIdToken(token, true);
// pull the user's username from their user data
// at /users/{userId}/username
const username = (await admin.database().ref("users/" + uid + "/username")).val();
// use user's actual email if available, otherwise fallback
// to a userID based email
const uEmail = email || uid + "@users.noreply.yourapp.com";
// use user's username if available, otherwise fallback to
// the email address above.
const uLogin = username !== null ? username : uEmail;
return {
uid,
login: uLogin,
email: uEmail,
user: {id: uid, login: uLogin, email: uEmail}, // <- this part in particular is used by ConnectyCube
users: [{uid, login: uLogin, email: uEmail}]
};
}
部署后,您将使用以下设置:
环境 | 价值 |
---|---|
接口网址: | https://us-central1-PROJECT-ID.cloudfunctions.net/verifyUserToken |
获取/发布 | GET |
请求参数: | {"token": "#{login}"} |
响应参数: | {"uid": "#{user.id}", "email": #{user.email}, "login": "#{user.login}"} |
推荐阅读
- java - 为什么我必须在 Java 中链接 Stream 操作?
- php - 使用 MySQL 查询作为 PHP 脚本的标识,将 FCM 推送通知发送到 android 应用程序中的特定设备
- python-3.x - 如何使用美丽的汤获得李名
- python - 将数据框中的 JSON 列转换为简单的值数组
- excel-formula - 使用 If Then 函数时遇到问题
- pdf - Yii2: Setasign fpdi
- sql - 在 Presto 中按最近的时间戳加入
- css - 带框阴影且宽度不等的三角形
- mysql - (mysql(mariadb 10.xx))在哪里匹配全文和按主键排序说'使用文件排序'
- php - 根据旧记录的值从查询中获取新记录