- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 NestJS 后端中使用 PassportStrategy 实现了 Google 登录(NestJS 后端开发基于此指南: https://medium.com/@nielsmeima/auth-in-nest-js-and-angular-463525b6e071 )。
@Get('google')
@UseGuards(AuthGuard('google'))
googleLogin()
{
// initiates the Google OAuth2 login flow
}
@Get('google/callback')
@UseGuards(AuthGuard('google'))
googleLoginCallback(@Req() req, @Res() res)
{
// handles the Google OAuth2 callback
const jwt: string = req.user.jwt;
if (jwt)
return res.status(HttpStatus.OK).cookie('jwt', jwt, {
httpOnly: true
}).redirect('/');
else
res.redirect('http://localhost:4200/login/failure');
}
使用 @UseGuards(AuthGuard('google')) 应该启动 google 登录:
super({
clientID : 'XXX', // <- Replace this with your client id
clientSecret: 'XXX', // <- Replace this with your client secret
callbackURL : 'http://myapp.herokuapp.com/auth/google/callback',
passReqToCallback: true,
scope: ['profile']
})
如果我将调用 auth/google 放入浏览器的地址栏中,它就可以工作。
如果我从 React WebApp 调用 auth/google 方法,它将不起作用,网络请求如屏幕截图中所示。我没有回复任何数据。
看起来回调没有启动,但“passReqToCallback: true”有效。
响应前端请求:
fetch("http://<url>/auth/google", {
method: "GET",
mode: 'no-cors',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
})
.then(
(result) => {
if (result) {
history.push({
pathname: '/home'
});
}
},
(error) => {
}
);
登录顺利时的后端日志:
2021-02-18T10:34:02.724706+00:00 heroku[router]: at=info method=GET path="/auth/google/" host=myapp.herokuapp.com request_id=310ac45a-3657-4c5f-96dc-f0a1350429db fwd="93.146.33.170" dyno=web.1 connect=1ms service=10ms status=302 bytes=371 protocol=http
2021-02-18T10:34:03.321194+00:00 app[web.1]: {
2021-02-18T10:34:03.321209+00:00 app[web.1]: id: 'XXX',
2021-02-18T10:34:03.321210+00:00 app[web.1]: displayName: 'XXX',
登录失败时的后端日志:
2021-02-18T10:36:29.284759+00:00 heroku[router]: at=info method=GET path="/auth/google" host=myapp.herokuapp.com request_id=2f56f65b-9236-4710-b029-dd973ec0c9a3 fwd="54.187.137.25" dyno=web.1 connect=0ms service=3ms status=302 bytes=371 protocol=http
nothing else
有什么想法吗?你能帮我吗?
谢谢。
最佳答案
您实现谷歌登录的方式对于全栈应用程序很有用。由于您使用的是单独的 React 应用程序(我们称之为 SPA),您需要进行一些更改。首先,您的后端不需要 /google
端点。这部分应该由 SPA 完成。用户使用 google 登录后,应再次将其重定向到 SPA。此重定向将为您提供查询参数中的用户信息和访问 token 。
只有这样,您才能将该信息转发到后端的 /google/callback
路由。您已经通过 google
authguard 进行了 google token 验证,因此剩下的唯一事情就是使用 google 为您提供的信息来登录用户。我想在你的情况下这意味着生成一个 JWT。不要使用谷歌提供的 token 。生成您自己的 JWT。
来自谷歌documentation :
If you use Google Sign-In with an app or site that communicates with a backend server, you might need to identify the currently signed-in user on the server. To do so securely, after a user successfully signs in, send the user's ID token to your server using HTTPS. Then, on the server, verify the integrity of the ID token and use the user information contained in the token to establish a session or create a new account.
关于reactjs - React WebApp 调用 NestJS 后端中使用 PassportStrategy 的 Google 登录无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66250525/
我在开发应用程序时将配置保存在 .env 文件中。 这是我的 app.module.ts: @Module({ imports: [ ConfigModule.forRoot({ isGl
我正在使用我购买的 akveo 后端包,虽然在开发模式下一切似乎都在生产中运行良好,但出现了以下错误,但我对 nestjs 本身并不熟悉。 有谁知道这里发生了什么? node_modules/@nes
我刚刚开始使用 Nestjs我想知道如何使用路由前缀或通过 Express Router 实例对我的 API 进行版本控制? 理想情况下,我希望通过以下方式访问端点: /v1 /v2 等等,这样我就可
我想了解将服务提供商注入(inject) NestJS Controller 的目的是什么?这里的文档在这里解释了如何使用它们,这不是这里的问题:https://docs.nestjs.com/pro
我正在使用@goevelup/nestjs-rabbitmq库构建一个NestJS应用程序,以便将消息发布到rabbitmq交易所。。我正在AppModule中导入和配置RabbitMQ模块(这部分似
我正在使用@goevelup/nestjs-rabbitmq库构建一个NestJS应用程序,以便将消息发布到rabbitmq交易所。。我正在AppModule中导入和配置RabbitMQ模块(这部分似
我正在制作 @nestjs/swagger生成api文档。但是如何为经过身份验证的路由生成文档? 嵌套版本 λ nest i NodeJS Version : v10.16.0 [Nest Infor
NestJs 允许导出模块和提供者。它们有什么区别? 例子: // Reusable module @Module({ providers: [ServiceA], exports: [Service
我有一个返回字符串的 Controller 处理程序。 // Controller.ts import { Controller, Get, UseInterceptors } from '@nest
在 NestJS API 上,我想在实体中使用模块服务,以使用非数据库属性填充该实体。 在我的例子中,我想获得我正在检索的类别的文章数量。 @Entity({ name: 'categories' }
我正在设置一个新的 NestJS 应用程序,我刚刚添加了类验证器以验证 Controller 输入,但它似乎被完全忽略了。这是 DTO: import {IsString} from 'class-v
我想要一些环境,比如说development , production , test .这些环境应该是独立的,并使用它们自己的配置参数集,例如对于 DB、SERVER_PORT、USER 等。 它们不
我觉得 this thread 和 this thread 的组合是我需要实现的,我无法将它们绘制在一起。 我有一个包含 enum 的 DTO。 使用 Postman,我发送 PurchasableT
我是 NestJs 的新手,我创建了一个回退异常过滤器,现在我想知道如何使用它。换言之,如何将其导入我的应用程序? 这是我的后备异常过滤器: @Catch(HttpException) export
我在oracle数据库中有存储过程,我想在NestJs中调用它。 如何在 NestJs 中调用存储过程? 这是我的存储过程 PROCEDURE pipeline_critical (
我想在 nestjs 的验证中使用正则表达式。 例如: 正则表达式 pagePattern = '[a-z0-9\-]+'; 方法 @Get('/:article') getIndex(
我想将配置字符串传递给管道,但也想注入(inject)服务。 NesJs 文档描述了如何相互独立而不是一起执行这两项操作。举个例子: 管道.ts @Injectable() export class
我正在尝试对具有来自 nestjs 护照模块的 AuthGuard 的路由进行端到端测试,但我真的不知道如何处理它。当我运行测试时,它说: [ExceptionHandler] Unknown aut
我正在编写一个 NestJS 应用程序。一些端点支持排序,例如http://127.0.0.1:3000/api/v1/members?sort=-id&take=100 这意味着按 id 降序排序。
我想在 nestjs 的验证中使用正则表达式。 例如: 正则表达式 pagePattern = '[a-z0-9\-]+'; 方法 @Get('/:article') getIndex(
我是一名优秀的程序员,十分优秀!