- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,我想在其中使用第 3 方 API(例如 Google、Facebook 等)登录。客户端前端只是一个将与我的服务器交互的 JavaScript SPA。服务器本质上只需要存储第 3 方 ClientID
和 ClientSecret
。
要登录,客户端会将用户链接到 MyAPI/login
。然后,MyAPI 会将用户重定向到第 3 方登录页面,以及 ClientID
。身份验证后,第 3 方将使用 code
查询参数将用户重定向回 MyAPI/callback
。 MyAPI 会将此 code
与 ClientID
和 ClientSecret
一起发送回第 3 方 API。第 3 方 API 最终将返回一个 access_token
和 refresh_token
。
我的问题是我应该如何将 token 发送回客户端应用程序?而且,一旦客户有了 token ,我应该如何存储它们?
最佳答案
您所描述的是 OAuth 的授权代码授予流程。在 Auth Code 流程中,向客户端(在本例中为 MyAPI)提供一个代码,以便用户永远不会收到 access_token
或 refresh_token
,因此不必信任他们。
通过向用户提供这些 token 并允许他们将其存储在本地存储中,您正在规避授权代码流的安全优势。绝对不建议这样做,除非安全性对您来说不是一个大问题(您信任用户)。
正如评论所建议的那样,您可以使用 cookie 来保持与 MyAPI 的 session 。不过,access_token
和 refresh_token
应该保存在 session 数据中,而不是直接与用户共享。这强制对第 3 方 API 的访问只能由 MyAPI 代表用户进行。
此问题的已接受答案中提供了对授权码流程的更好解释:What is the difference between the 2 workflows? When to use Authorization Code flow?
MyAPI 的不完整 Express.js 示例:
// imports
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const jwt = require('jsonwebtoken');
// setup passport (an authentication middleware) and use it with the session provided by express-session
passport.serializeUser((user, done) => {
done(null, user);
});
passport.deserializeUser((obj, done) => {
done(null, obj);
});
passport.use(new SomeStrategy(...strategyOptions));
const app = express();
app.use(passport.initialize());
app.use(passport.session());
// route handlers
app.get('/login', passport.authenticate('SOME_STRATEGY'), () => {});
app.get('/callback', passport.authenticate('SOME_STRATEGY'), { failureRedirect: '/badlogin' }, (req, res) => res.send(200));
app.get('/resource', (req, res) => {
const accessToken = req.user.access_token; // req.user has the session information including the access token
try {
// verify the access token with the 3rd party auth's public key (NOT THE SAME AS DECODING IT!)
const decodedAccessToken = jwt.verify(accessToken, thirdPartAuthPublicKey);
return res.send(200).send(decodedAccessToken);
} catch (err) {
return res.send(401).send('unauthenticated');
}
});
这里,服务器将access_token
保存在用户的 session 数据中(req.user
)。当用户请求资源时,服务器会尝试验证 access_token
并返回其解码后的内容。
关于javascript - 如何将 oauth2 token 发送给客户端并存储它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232683/
我是一名优秀的程序员,十分优秀!