- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个基本的前端应用程序,我希望能够让用户注册和登录。我决定为此使用的服务是 IBM 的 AppID。我的应用程序的流程如下:前端应用程序(React)通过 axios 向 Node 服务器发出 get/post 请求。然后服务器从 mongo 数据库检索数据。我希望用户单击 React 应用程序上的登录按钮,然后将他们重定向到 AppID 上的登录表单,经过身份验证后,用户将被重定向到之前因未经授权而受到保护的另一个页面。
IBM 网站上的文档显示了一个保护 Node 应用程序的示例,其中前端也在 Node 应用程序上。这些是文档:https://cloud.ibm.com/docs/services/appid?topic=appid-web-apps#web-apps
const mongoose = require("mongoose");
const express = require("express");
let cors = require("cors");
const bodyParser = require("body-parser");
const logger = require("morgan");
const API_PORT = 5100;
const app = express();
app.use(cors());
//bodyParser, parses the request body to be a readable json format.
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(logger("dev"));
app.use(
session({
secret: "xxxxx",
resave: true,
saveUninitialized: true
})
);
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser((user, cb) => cb(null, user));
passport.deserializeUser((user, cb) => cb(null, user));
passport.use(
new WebAppStrategy({
clientId: "ca5d4ajsnfjsandew-e-f-w-rg--94e1681c6821",
tenantId: "61982sedfysehfnscd-sfvs-dsf-sfds-464c7fbc",
secret: "MmY3ZDJhNGQtfshbdfksndlsdjfjsbjdfjsdjhfbskYWRj",
name: "TEA-web-app",
oAuthServerUrl:
"https://us-south.appid.cloud.ibm.com/oauth/v4/619820bahfbsef2-5931-4748-ba39-1cc4fsd464c7fbc",
profilesUrl: "https://us-south.appid.cloud.ibm.com",
discoveryEndpoint:
"https://us-south.appid.cloud.ibmdds.com/oauth/v4/619820b2-5931ffd-4748-ba39-1cc4464c7fbc/.well-known/openid-configuration",
redirectUri: "http://localhost:3000/dashboard"
})
);
app.use(passport.authenticate(WebAppStrategy.STRATEGY_NAME));
//link to mongoDB database
const dbRoute =
"mongodb+srv://username:password@cluster0-zjqhi.mongodb.net/TEA?retryWrites=true&w=majority";
//connect backend with mongoose database.
mongoose.connect(dbRoute, { useNewUrlParser: true });
let db = mongoose.connection;
//Prompt when connected to database.
db.once("open", () => console.log("connection with database made"));
//check if connection made was successful.
db.on("error", console.error.bind(console, "MongoDB connection error: "));
const userRouter = require("./routes/users");
const dataRouter = require("./routes/data");
app.use("/users", userRouter);
app.use("/data", dataRouter);
// launch our backend into a port
app.listen(API_PORT, () => console.log(`LISTENING ON PORT ${API_PORT}`));
这是我编写的服务器端代码,我不确定我是否应该在服务器端执行此操作,或者是否应该在我的 React 应用程序上编写身份验证代码。可以在前端实现吗?
最佳答案
是的,所以您可以让后端与 App ID 对话,从而获取 token 。获得 token 后,您可以实现基于 cookie+ session 的方法来维护前端和后端之间的某些 session 。
有关更多信息,请查看此博文:https://www.ibm.com/cloud/blog/securing-angularnode-js-applications-using-app-id 。该博客特别提供了一个与 Angular 前端和 Node 后端配合使用的示例,并实现了 cookie+session 方法。但是,同样的原则也适用于 React。
博客示例代码:https://github.com/ibm-cloud-security/appid-sample-code-snippets/tree/master/angular-node-sample
重要说明:我注意到在您的代码片段中,您以纯文本形式发布了应用程序 ID secret
。我强烈建议您删除这些凭据并从 App ID 获取一对新凭据。现在,任何拥有您的 clientId
和 secret
的人都可以冒充您的应用程序。
关于node.js - 通过IBM app-id向React应用程序添加用户授权和身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57483311/
出现在 python 2.7.8 中。 3.4.1 不会发生这种情况。 示例: >>> id(id) 140117478913736 >>> id(id) 140117478913736 >>> id
好吧,我对动态创建的控件的 ID 很困惑。 Public Class TestClass Inherits Panel Implements INamingContainer
我收到下面的错误,说有堆栈溢出。发生这种情况是因为带有 IN (id, id, id...id) 的 SQL 语句有大量参数。有没有什么办法解决这一问题?这是在我使用 Eclipse 的本地环境中发生
为什么 CPython(不知道其他 Python 实现)有以下行为? tuple1 = () tuple2 = ()
为什么 CPython(对其他 Python 实现一无所知)有以下行为? tuple1 = () tuple2 = ()
非常简单的问题:当我有一个持久对象时,它通常有一个名为 ID 的属性(对于抽象类)。 那么..命名约定是ID还是Id? 例如。 public int ID { get; set; } 或 public
知道为什么我会收到此错误,我已经尝试了所有命名约定(小写/大写) 我正在使用 Vaadin,这是我的代码片段: public class Usercontainer extends BeanI
为什么 CPython(不知道其他 Python 实现)有以下行为? tuple1 = () tuple2 = ()
我需要改变表的所有主键 UPDATE TODO SET id = id + 1 但我做不到(Demo 来自 Ahmad Al-Mutawa 的回答)描述了原因。主键不能这样改。 我也不能根据这是 sq
我正在尝试列出与用户相关的讨论列表。 想象一下,如果你愿意的话: posts -------------------------------------------------------------
我有一个表,其中包含一些具有自己的 ID 和共享 SKU key 的文章。我尝试使用左连接进行查询,并使用组结果获取从查询返回的所有 id。 我的数据结构是这样的: id - name -
在下表People中: id name 1 James 2 Yun 3 Ethan 如果我想找到最大 ID,我可以运行此查询 select max(id) id from People; 结果是
我正在产品页面上创建评论模块,其中显示垃圾评论选项,并显示 onclick 显示和隐藏弹出窗口。现在它在单个评论中工作正常但是当评论是两个时它同时打开两个因为类是相同的。现在这就是为什么我想要获取父
根据 REST 哲学,PUT操作应该(取自维基百科): PUT http://example.com/resources/142 Update the address member of the co
我想知道如何在使用 PHP 或 JavaScript 进行身份验证后从 Google Analytics 获取 Property Id、View Id 和 Account Id?因为我希望能够将它们存
我想使用所选按钮的 ID 进行删除。但我不知道如何从中获取/获取 id。我尝试了 this.id 但不起作用。 这是我创建按钮的地方: var deleteEmployer= document.cre
我有一个具有以下结构的表“表” ID LinkedWith 12 13 13 12 14 13 15 14 16
请不要在未阅读问题的情况下将问题标记为重复。我确实发布了一个类似的问题,但 STACKOVERFLOW 社区成员要求我单独重新发布修改后的问题,因为考虑到一个小而微妙的修改,解决方案要复杂得多。 假设
在 Android Studio 中,我创建了一个 Person.java 类。我使用Generate 创建了getter 和setter 以及构造函数。 这是我的 Person.java 类: pu
如何在 jQuery 中制作这样的东西: //这是显示的主体 ID //当我悬停 #hover-id 时,我希望 #principal-id 消失并更改 。但是当我将光标放在 #this-id 上时
我是一名优秀的程序员,十分优秀!