服务器端 Web 应用程序的 Google Oauth2 的 CORS 问题

2024-03-28

我在SO上提到了这个问题:Google oauth 400 响应:请求的资源上不存在“Access-Control-Allow-Origin”标头 https://stackoverflow.com/questions/36688035/google-oauth-400-response-no-access-control-allow-origin-header-is-present-on但建议的解决方案是JavaScript 网络应用程序 using 隐性拨款流.

我的设置是这样的,我的前端是基于 Angular 4 构建的,但我将其打包并将其与其余 api 一起部署在同一服务器上。 Si 我正在跟踪服务器端 Web 应用程序流程:https://developers.google.com/identity/protocols/OAuth2WebServer https://developers.google.com/identity/protocols/OAuth2WebServer (以下示例中服务器端口为8300)

我已授权http://本地主机:8300 http://localhost:8300作为 Javascript 起源,并从 Angular 应用程序向驻留在其上的 REST API 发出请求http://localhost:8300/auth/oauth/test http://localhost:8300/auth/oauth/test但我仍然收到 CORS 错误:

加载失败: 请求中不存在“Access-Control-Allow-Origin”标头 资源。起源 'http://本地主机:8300 http://localhost:8300' 因此不允许 使用权。

我的问题是 :

  1. 是否建议解决方案here https://stackoverflow.com/questions/36688035/google-oauth-400-response-no-access-control-allow-origin-header-is-present-on,唯一的出路?
  2. Google API 页面上是否有一些我错过的配置?
  3. 如果我直接访问rest apihttp://localhost:8300/auth/oauth/test http://localhost:8300/auth/oauth/test直接从浏览器,一切都很好。但是,如果我从浏览器向此 url 发出 get 请求(因为它是安全的,因此应该重定向到 google api,在身份验证后,至少应该命中此其余 api 断点)。因为在这两种情况下,它都可以访问
    我最后的假设是错误的吗?

如果这是相关的,我正在执行 Angular get 请求,如下所示:

loginWithGoogle(){
    console.log(" Login with oauth2 ");
    let oauthUrl = "http://localhost:8300/auth/oauth/test";
    return this.http.get(oauthUrl)                                
      .subscribe(
        res => {                    
          this.onSuccess(res);
        }, error => {
          this.onFailure(error);
        });

}

EDIT

实际上,我的第三点是为什么当从角度应用程序通过 XHR 访问 REST API 时会抛出 CORS,该应用程序也与 REST API 位于同一域,而不是直接从浏览器访问 REST API 时抛出 CORS。


当您使用授权代码授予(后端应用程序的 OAuth2 -&response_type=code),您必须将浏览器重定向到/auth端点 - 您不能为此使用 XHR。身份验证后,用户将被重定向回来。

重定向到之后/auth端点,用户需要在地址栏中看到该页面来自 Google(可信来源),并且 Google 可能需要执行更多重定向才能对用户进行身份验证并显示同意页面。所以使用XHR是不可能的。

更新:对于第三点,如果请求不包含有效凭据(而不是像现在那样的 HTTP 30x 重定向),您的后端 API 应返回 HTTP 401。然后,您的 Angular 应用程序需要一个 HTTP 错误处理程序,用于在 HTTP 401 响应上重定向浏览器。

但如果您想将令牌保留在 Angular 应用程序中,最好使用隐式授予,它是为在浏览器中运行的应用程序设计的。因为使用授权代码授予,您的后端具有客户端的角色(在 OAuth2 方案中),但您希望 Angular 应用程序成为客户端(因为它持有令牌)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务器端 Web 应用程序的 Google Oauth2 的 CORS 问题 的相关文章

随机推荐

  • getchar() 返回错误的特殊情况是什么?

    所以我知道getchar 当输入结束或发生错误时返回 EOF 我也知道我可以通过以下方式检查发生了哪些情况ferror stdin and feof stdin 我想知道什么情况下会特别发生错误 我检查了这两个函数的手册页 但那里没有任何内
  • 就性能而言,使用 std::memcpy() 还是 std::copy() 更好?

    是不是比较好用memcpy如下所示还是使用更好std copy 就性能而言 为什么 char bits NULL bits new std nothrow char int copyMe gt bits 0 if bits NULL cou
  • 使用 Foreman 重新启动单个进程

    我已经使用 foreman 一段时间来以集中方式扩展我的各种 ruby 流程 并且它对我来说工作得很好 无论如何 我希望有一些功能来重新启动进程 甚至给它更多的控制权 例如终止进程并再次启动它 在当前的实现中 当我终止一个进程时 主工头中的
  • Chrome 无法播放 MP4

    我每天都会从我的安全摄像头系统中收到几封发送到我的 Gmail 帐户的电子邮件 此类邮件包含来自摄像机的 MP4 格式的视频剪辑 每个大约 20 秒 的链接 奇怪的是 在基于 Mageia 的 PC 上单击此类链接后 剪辑将打开并在新的单独
  • 在matlab中将绘图保存到图像文件中:saveas和print之间的区别

    我想知道在matlab中将绘图保存到图像文件时 saveas和print有什么区别 什么情况下两者可以同时使用 什么情况下只能使用其中一种 感谢致敬 我相信 SAVEAS 只是 PRINT 的包装 查看 SAVEAS 的源代码 编辑 sav
  • 对于缺少模板,给出 404 而不是 500 错误

    我有一个 Rails 3 0 应用程序 正在进行 3 2 升级 每当有人请求不存在的模板时 它都会在生产中给出 500 错误 例如 mysite com blog posts 532 将 ID 为 532 的帖子以 HTML 形式发送回来
  • 如何访问页面框架以通过 UWP 中的 UserControl 对象导航页面?

    我正在开发一个 UWP 应用程序 涉及多个用户控制 https learn microsoft com en us dotnet api system windows controls usercontrolMap 中的对象使用Window
  • 月份 R 没有前导零 [重复]

    这个问题在这里已经有答案了 format 在 R 中没有明显的选项来显示不带前导 0 的月份 与年份相同 还有其他方法可以得到这个结果吗 该解决方案应允许用户灵活选择是否仅在日 月 年或任意组合中省略 0 in as Date 2005 0
  • 在特定窗口中打开 Org Capture 缓冲区?

    我成为 Emacs 用户大约一年左右了 我通常为每个会话设置相同的窗口 四个窗口 我已经设置了捕获模板并且可以捕获我想要的内容 但是 我希望所选的捕获模板在新的 第五个 窗口中打开 保留我现有的窗口 而不是捕获模式暂时将我从窗口设置中拉出来
  • 注入相同类型的多个实例 - Autofac

    我试图在构造函数中注入同一类的多个实例 然而 当它们被解析时 它们总是解析为同一个实例 这是我的注册码 public Repository Class1 class1 Class1 class2 class1 class1 class2 c
  • SQLite 中的 SELECT INTO 语句

    sqlite是否支持SELECT INTO陈述 实际上我正在尝试将数据保存在table1 into table2作为修改数据之前数据库的备份 当我尝试使用SELECT INTO陈述 SELECT INTO equipments backup
  • 如何缩放具有背景大小的 div 上的背景图像

    我想要一个 div 元素拉伸 33 宽度 背景图像用 css 完成 background image url background size cover 如何在鼠标悬停或 mouseneter 上对 div 中的背景图像进行放大动画 是否有
  • 我的 Objective-C 单例应该是什么样子? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Rails 找不到临时目录(ArgumentError)

    我正在将我的 Rails 项目上传到运行 12 04LTS 的 Ubuntu 服务器 但我似乎无法解决此问题 无论我是进行捆绑安装还是尝试使用 gem 我都会收到该错误 我读了很多 但仍然无法修复它 lib ruby 2 0 0 tmpdi
  • 我可以在 Vuex 中从 getter 进行调度吗

    小提琴 here https jsfiddle net 9a6Lg2vd 6 我正在使用 Vue 2 和 Vuex 创建一个 web 应用程序 我有一个商店 我想从 getter 获取状态数据 我想要的是如果 getter 发现数据尚未填充
  • 无法加载 spacy en_core_web_trf

    正如自我指南所说 我已经安装了它 conda 环境 conda install c conda forge spacy python m spacy download en core web trf I have spacy transfo
  • Perl split 函数 - 使用重复字符作为分隔符

    我想使用重复字母作为分隔符来分割字符串 例如 123aaaa23a3 应该拆分为 123 23a3 while 123abc4 应保持不变 所以我尝试了这个 s split alpha 1 123aaaa23a3 但这返回 123 a 23
  • pygame可以使用矢量艺术吗?

    http cache kotaku com assets resources 2008 02 dbzburstcell jpg http cache kotaku com assets resources 2008 02 dbzburstc
  • QT Creator 无法在 i.Mx6 (buildroot) 上远程运行和调试

    使用基于 Qt 5 7 0 的 Qt Creator 4 0 2 我的应用程序名称是test 主板 带有 buildroot 的 i M6Q Qt 5 9 问题 A 当我运行 qt app 时显示此错误 EGL library doesn
  • 服务器端 Web 应用程序的 Google Oauth2 的 CORS 问题

    我在SO上提到了这个问题 Google oauth 400 响应 请求的资源上不存在 Access Control Allow Origin 标头 https stackoverflow com questions 36688035 goo