如何使用 OAuth 2.0 实现 Web 小部件

2024-04-26

我想创建一个 Web 小部件来显示我网站上的信息。

该小部件将使用 JavaScript 包含在客户网站的 HTML 中,并且只能用于我的客户(在我的网站上注册的网站)。

小部件中的信息应该特定于当前正在访问客户站点的用户。

因此,我需要对客户端(网站所有者)和资源所有者(网站访问者)进行身份验证。这似乎很好地映射到 OAuth 2.0,但我找不到此类实现的完整示例或解释。

任何资源或指向此类信息的指针将不胜感激。

Update:我偶然发现本文 http://supercollider.dk/2009/01/oauth-and-client-side-widgets-154,它提供了使用 OAuth 的方法的概要。但是,它还不够详细,无法让我真正理解如何将其与 OAuth 2 一起使用。


有许多大型组织已经这样做了,我很遗憾看到这个问题没有其他答案,因为它是一个如此重要的网络模式。

我假设您不会从头开始推出自己的 OAuth 2.0 提供程序,如果您是的话 - 做得很好,否则您应该使用类似的东西门卫 https://github.com/applicake/doorkeeper为你做这件事。

现在,在 OAuth 2.0 中,您拥有以下实体:

  1. 在您网站上注册的用户
  2. 在您的网站上注册的应用程序(订阅您的 oauth2 的应用程序)
  3. 用户权限是用户“允许”的应用程序列表
  4. 开发人员(正在使用您的身份验证 API/小部件并构建应用程序的人)

首先要注意的是你必须有与每个应用程序关联的域名。因此,如果开发人员在您的网站上注册 API 令牌/密钥,他创建的应用程序将映射到unique domain.

现在,我认为应用程序通过您的网站对用户进行身份验证的流程已经很清楚了。话虽这么说,您不需要做太多事情就可以实现这一点。

当应用程序将用户发送到您的网站(为了登录)时,您会在用户的计算机上放置一个会话 cookie。我们称之为“Cookie-X”。

现在,用户已通过您的网站进行身份验证并返回到应用程序。在那里,我们想要显示一个自定义小部件,其中包含与该用户相关的信息。

开发人员需要将一些代码复制粘贴到此应用程序中。

流程是这样的:

  1. 该代码将包含您网站的 URL,以及他在您的网站上注册应用程序时获得的应用程序 ID(非秘密)。

  2. 当该代码运行时,它将使用他的 appId 来 ping 您的网站。您需要使用数据库检查该 AppID,并另外检查引荐来源网址是否与您网站中为该 AppID 注册的域来自同一域。Edit:或者或另外,代码可以检查document.domain并将其包含在对您网站的 ping 中,以便您验证请求是否来自已使用给定 AppID 注册的域。

  3. 如果这是正确的,您将回复一些 JS 代码。

  4. 您的 JS 代码会查找您的网站在用户登录时设置的会话 cookie。如果找到该 cookie,它会通过会话 ping 回到您的网站,并且您的网站会使用自定义视图内容进行响应。

Edit:正如评论中正确提到的,cookie 应该是 HttpOnly 以防范常见的 XSS 攻击。

补充笔记

这是一种安全方法的原因:

  1. AppId 和域名是一个足够好的组合,可以验证其他人没有获取此信息。即使 appId 在应用程序 html 源中可见,任何试图使用其他人的 AppID 的人都必须欺骗域名。

  2. 假设有人在请求您的小部件时使用了不属于他的 AppID,并编写代码来欺骗引荐来源网址的域名,他仍然无法看到任何信息。由于您显示的是用户特定信息,因此只有当您的网站可以找到它放置在用户浏览器上的会话 cookie(实际上无法被欺骗)时,小部件才会呈现。有一些方法可以解决,例如会话劫持等。但我认为这超出了这个问题的范围。

其他方法只需查看 Facebook 的社交插件,您就会发现还有其他选择。

例如,可能会使用 Iframe。如果您要求开发人员向其应用程序添加 Iframe,您甚至可以减少上面提到的一些步骤。但是您必须添加 JS(在 iframe 之外)以获取正确的域等。当然,从可访问性和界面的角度来看,我不太喜欢 Iframe。

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

如何使用 OAuth 2.0 实现 Web 小部件 的相关文章

  • 浏览器视口大小(以设备像素为单位)

    Goal 我希望 Flash 能够获得有关浏览器视口宽度和高度 以设备像素为单位 的准确信息初始化 调整大小或浏览器缩放事件时 规格 我需要将 flash 嵌入到在 chrome safari firefox 等中运行的 html 页面中
  • Firebase,只得到新的孩子[重复]

    这个问题在这里已经有答案了 var firebase new Firebase firebaseRef on child added function snapshot 这将接收所有元素 有没有办法在创建新的 Firebase 引用时不接收
  • Angular.js:如何从无序列表中获取 orderBy 或过滤器来工作?

    尝试根据价格和评级 在返回的对象中 进行排序 我宁愿用 ng click 和 li 来代替使用选择菜单 有没有办法做到这一点 我环顾四周 这是我能想到的最接近的 ul class restaurant filter li i class i
  • 如何使用有角度的材料创建卡片网格?

    我正在尝试使用 ng repeat 创建每行三张卡片的网格 我有一个普通的 javascript 对象数组附加到范围 下面的代码将为每张卡创建一个新行 div div
  • 通过 JavaScript 获取表单名称

    我有一个简单的问题 但我在网上找不到好的解决方案 我有这个 HTML 代码
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • IntersectionObserver是否支持水平滚动观察?

    我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
  • Rails 3 Mechanize - SocketError:getaddrinfo:主机或名称未知

    我正在使用 mechanize 但出现此错误 有人可以帮帮我吗 我已将元刷新设置为 true 错误日志 SocketError getaddrinfo Host or name not known form C Ruby192 lib ru
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • 如何在另一个自定义 Hook 中使用返回值的自定义 Hook?

    我正在使用 React native 其中有一个名为的自定义 HookuseUser使用以下方法从 AWS Amplify 获取用户信息Auth getUserInfro方法 然后获取返回对象的一部分并用它设置一个状态变量 我还有另一个名为
  • ActiveRecord:向包含的 ON 子句添加条件

    我有一个模型报价和另一个历史报价 一个报价有很多历史报价 现在 我想立即加载一组报价的某一天的历史报价 如果存在 为此 我认为我需要将这一天传递给 ON 子句 而不是 WHERE 子句 以便我获得所有报价 即使在给定日期没有历史报价时也是如
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供

随机推荐

  • 下载 VSTS 附件

    有人知道如何使用 C 库检索附件 ID 并从 VSTS 下载 WorkItem 附件吗 我已经审查了附件样本 https github com Microsoft vsts dotnet samples blob master Client
  • Symfony ArrayCollection 与 PersistentCollection

    据我了解 当您通过存储库查询数据库时 您会得到 PersistentCollection 而当您使用实体时 您会得到 ArrayCollection 因此 考虑到我的用户实体有一对多的自引用关系 在我的用户实体中 我有一个 setChild
  • WPF 中的多列树视图 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道我在哪里可以获得 WPF 中的多列树视图之类的控件吗 夏普开发 http www icshar
  • Xalan XSLT 多个输出文件?

    我只是想知道 是否可以使用 Xalan 将单个输入 XML 文件的处理输出到多个其他文件 我不一定必须这样做 我知道我可以使用其他工具来做到这一点 如 Saxon 和 或我可以处理不同的文件以获得不同的输出 我只是想知道我必须使用哪些选项来
  • 无法计算表达式 - Visual Studio 调试模式

    当尝试单步执行代码并使用 Visual Studio 中的立即窗口或监视窗口时 我不断收到以下信息 无法评估表达式 我正在使用 Visual Studio 2008 搜索论坛 有很多关于使用重载的 Response Redirect 并将
  • 如何确定单元测试的测试用例?

    我刚刚开始单元测试 并编写了一些简短的测试来检查名为 isPrime 的函数是否正常工作 我有一个测试来检查该函数是否正常工作 并有一些数字和预期返回值形式的测试数据 我应该测试多少 我如何决定测试哪个 这里的最佳实践是什么 一种方法是生成
  • 从另一个 Java 小程序访问 Java 小程序

    Web 应用程序使用 Java 小程序 该小程序将用户提交的密码存储在私有属性中 并在多个公共方法中使用该属性 我想知道从相同或不同网站加载的另一个 Java 小程序是否可以调用该小程序的方法或可能访问包含密码的私有属性 不同的小程序是在相
  • 当您在 REST 中需要更多动词时该怎么办

    还有一个类似的question https stackoverflow com questions 2001773 understanding rest verbs error codes and authentication对我来说 但讨
  • “node-sass”用法已弃用,并将在未来的主要版本中删除

    当我从 Angular 升级时8 to 11我面临这个警告 node sass 用法已弃用 并将在未来的主要版本中删除 要选择退出已弃用的行为并开始使用 sass 请卸载 node sass 谁能帮我提前致谢 完整的错误消息是 node s
  • .Net Core 本地化视图:Linq 表达式中的 IViewLocalizer

    我正在 net core 中编写 mvc 应用程序 我遇到本地化问题 我不知道如何将 IViewLocalizer 添加到我的网格视图中 这是我的代码 using NonFactors Mvc Grid using Microsoft As
  • 流星刀片模板在 for 循环中抛出“同一分支中的第二个地标”异常

    我有一个 for 循环 我想在其中包含模板视图 表 刀片 game h1 table name if table playerSitting a btn btn danger stand href Stand table for var i
  • 如何使用 google-apps-script 以 Google 表单导入“文件上传”模块

    I am able to create a small google form using google apps script Which includes texts radio buttons etc But how to inclu
  • 身份框架用户锁定

    我尝试在 3 次登录尝试失败后锁定用户登录 5 分钟 我已将这 3 行添加到App Start IdentityConfig cs public static ApplicationUserManager Create method man
  • Keras 使用 mask 冻结特定权重

    我是 Keras 的新人 我想实现一个并非所有权重都会更新的层 例如 在下面的代码中 我想要dilation图层将以某些中心权重永远不会更新的方式进行更新 例如 每个特征矩阵 共 1024 个 的形状dilation层是448 448和一块
  • 是否有与 :hover 相反的 CSS 伪类?

    CSS中有没有伪类来指定 not hover 或者这是指定未悬停的项目的唯一方法 我浏览了几个 CSS3 参考资料 但没有看到任何提及 CSS 伪类来指定 hover 的相反内容 是的 使用 not hover child not hove
  • 使用Bundle传递数据时出现空指针异常

    我有一个浮点数组camObjCoord宣告为 public static float camObjCoord new float 8000 然后我在一个类中填充它的索引 该类执行如下操作 camObjCoord 1 2 5 然后我打电话ma
  • 更改 UIWebView 的文本颜色

    我正在制作一个 epub 阅读器 我将 HTML 页面加载到其中webview webview loadRequest NSURLRequest requestWithURL NSURL fileURLWithPath pagesPath
  • glibc 已弃用的 __malloc_hook 功能的替代方案

    我正在为 C 编写一个内存分析器 并为此拦截对malloc realloc and free通过 malloc hooks 函数 不幸的是 这些已被弃用 因为它们在多线程环境中表现不佳 我找不到描述实现相同目标的替代最佳实践解决方案的文档
  • 如何在 Plotly 中旋转绘图的轴?

    我在 Plotly 中完成了以下情节 如您所见 X Y 轴采用传统方式 如何旋转轴 使 X 垂直绘制 Y 水平绘制 向左 我还想修改每个轴的范围和间距 我想它必须对布局元素做一些事情 我的代码到目前为止 layout go Layout t
  • 如何使用 OAuth 2.0 实现 Web 小部件

    我想创建一个 Web 小部件来显示我网站上的信息 该小部件将使用 JavaScript 包含在客户网站的 HTML 中 并且只能用于我的客户 在我的网站上注册的网站 小部件中的信息应该特定于当前正在访问客户站点的用户 因此 我需要对客户端