当前位置: 首页 > 知识库问答 >
问题:

如何将oauth2令牌发送到客户端并存储它们?

葛永丰
2023-03-14

我有一个应用程序,我想用第三方API(如谷歌、Facebook等)登录。客户端前端只是一个JavaScript SPA,它将与我的服务器交互。服务器基本上只需要存储第三方ClientIDClientSecret

要登录,客户端将用户链接到MyAPI/login。然后,MyAPI将用户重定向到第三方登录页面以及ClientID。认证后,第三方将使用code查询参数将用户重定向回MyAPI/callback。MyAPI将此codeClientIDClientSecret一起发送回第三方API。第三方API最终将返回访问\u令牌刷新\u令牌

我的问题是如何将令牌发送回客户端应用程序?而且,一旦客户机拥有代币,我应该如何存储它们?

共有1个答案

马弘益
2023-03-14

您所描述的是OAuth的授权代码授权流。在身份验证代码流中,向客户端(在本例中为MyAPI)提供一个代码,以便用户永远不会收到access\u令牌refresh\u令牌,因此不必信任它们。

通过向用户提供这些令牌并允许他们将其存储在本地存储中,您正在规避身份验证代码流的安全优势。除非安全性对您来说不是一个大问题(您信任用户),否则绝对不建议这样做。

正如评论所建议的,您可以使用cookies来持久化与MyAPI的会话。不过,access\u令牌refresh\u令牌应该保存在会话数据中,而不是直接与用户共享。这强制要求仅由MyAPI代表用户访问第三方API。

在这个问题的公认答案中提供了对身份验证代码流的更好解释:这两个工作流之间的区别是什么?何时使用授权代码流?

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保存在用户的会话数据中(req.user)。当用户对资源发出请求时,服务器尝试验证access_token并返回其解码内容。

 类似资料:
  • 我的SPA应用程序使用以下体系结构(来源): 这假设我的客户端应用程序知道刷新令牌,因为如果没有用户凭据(例如电子邮件/密码),我需要它来请求新的访问令牌。 我的问题:在客户端应用程序中,刷新令牌存储在哪里?关于这个话题有很多问题/答案,但是关于刷新标记,答案并不清楚。 访问令牌和刷新令牌不应存储在本地/会话存储器中,因为它们不是存放任何敏感数据的地方。因此,我会将访问令牌存储在一个cookie中

  • 我正在使用Spring Boot 2.1.3和Spring Security 5.1.3实现一个OAuth2 web应用程序客户端,它通过授权代码授予类型从授权服务器获取JWT令牌,并调用受保护的资源服务器。 这是到目前为止的执行情况: 安全配置和用于调用受保护资源的restTemplate bean: 和调用受保护资源服务器的控制器: OAuth2客户端配置直接在application.yml中

  • 我在Spring框架中有csrf保护。所以在每个请求中,我都从ajax调用中发送csrf令牌,这是完美的工作。 在ajax

  • 在安全和身份验证策略方面,我完全是个笨蛋。所以我阅读了这篇关于“基于令牌的身份验证”的文章:https://scotch.io/tutorials/the-ins-and-out-of-token-based-authentication > 我不明白为什么中间人(或黑客)不能看到客户端发送的令牌,并使用令牌冒充该客户端/个人来检索资源?在这种意义上,什么使基于JSON Web令牌/OAuth2的

  • 我正在开发一个angularjs网络应用。 要访问服务器端api,我需要添加一个id_token头,并通过使用接收id_token。 问题的关键是——id_token有一个过期日期。在访问服务器应用编程接口之前,我需要确保id_token还没有过期,但是如果是,显而易见的选择是刷新它。 有没有办法刷新id_令牌? 我知道我可以将访问类型更改为脱机,并接收刷新令牌,但请求脱机访问似乎很奇怪,而在我的

  • 我使用节点js来验证用户并发回JWT令牌。我是使用角6.0前端。我的问题是在客户端将这个令牌存储在哪里?如果在客户端使用localstorage,如何保护此令牌?

  • 我在这里有点迷路,需要一些直接的请。我是新来Java,这是我试图写的第一个程序,显然与它斗争了一个月左右。因此,目前我们使用邮递员输入客户端ID/秘密从第三方应用编程接口获得访问令牌,使用该令牌我们可以从第三方的另一个终端请求资源。我正在尝试引用多个资源,如此Spring安全示例https://github.com/spring-projects/spring-security/blob/mast

  • 我需要实现一个github授权,然后将接收到的数据(JSON)发送到客户端。 我找到了这篇教程http://shiya.io/how-to-do-3-legged-oauth-with-github-a-general-guide-by-example-with-node-js/ 在该教程中,开发人员向我们展示了如下内容:“/”->“/login”->“/redirect”->“/user”(此处