- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是 stack overflow 的常客,但这是我的第一个问题。
我正在使用 OAuth2 规范开发授权服务器。我只是被困在如何在使用密码流的同时确保第一方客户端的真实性上。我阅读了很多论坛,这就是我得到的:
Javascript 单页客户端
Alex Bilbie 的这篇博文,他指出,为了避免 client_secret 问题,我们应该:
It’s simple; proxy all of your API calls via a thin server side component. This component (let’s just call it a proxy from here on) will authenticate ajax requests from the user’s session. The access and refresh tokens can be stored in an encrypted form in a cookie which only the proxy can decrypt. The application client credentials will also be hardcoded into the proxy so they’re not publicly accessible either.
但是现在这个代理可以被冒充我的人访问 Angular 应用程序。然后我看到了 Andy 的这篇博文外野手:How Secure is the OAuth2 Resourc Owner Password Flow for Single Page Apps .他基本上说要依靠 CORS 来避免冒充 JS 客户端。
使用这两种方法来保护我的 JS 应用程序是个好主意吗?
本地应用(桌面和移动)
在移动应用的情况下,我只找到授权的情况代码和隐式流程。这不是我想要的,因为重定向会损害用户体验。所以我对此的看法是:
我将使用 ROP 流程,然后使用一个client_id
为这个特定的安装生成并附上它到用户帐户,接收 access_token
和client_secret
作为响应。由此发出的任何其他 token 请求客户端必须携带此凭据(因为 client_id
是特定的对于安装,我将能够检查此客户端是否已经认证)。这样,如果有人使用任何凭据冒充客户,甚至注册一个假客户,我可以采取撤销用户和客户端访问权限的措施。
我知道这可能是想多了,我也知道有些事情并不能避免任何事情。我只是觉得尽我所能保护我的 API 是我的工作。
我非常感谢您对此问题的看法!我真的是多虑了吗?我应该只使用“公共(public)客户”的概念并继续吗?
谢谢大家,祝编码愉快!
最佳答案
首先,这个问题不是一个常见的优先级,因为大多数应用程序都是先用网站开发的,然后再用 API 开发的。这可能是原因,因为没有人知道如何使用 oauth2 处理第一批客户,因为每个人都开发了其他方法来做到这一点,而只需要 oauth2 来授予用户对第三方应用程序的访问权限。
即使您仅为第一个客户端应用程序开发了 oauth2 授权服务器(考虑单一身份验证机制而不是开发多个),您也应该尝试开发授权代码或隐式授权类型。您会意识到您需要一种方法来检查实际登录的用户。
两种常用的方法是:
无论哪种方式,您都需要检查您的应用程序安全性,用户 session 易受 CSRF 攻击,localStorage 易受 XSS 攻击。有很多关于如何保护您的网站免受任何一种攻击的文章,所以我不会在这里提出任何建议,您只需要知道它们的存在即可。
既然您选择了身份验证方法,我们就可以开始考虑:
代理
在我看来,拥有一个过滤所有请求的代理就像有一扇总是插着 key 的门。建门也没用。但是,对于基于 session 的身份验证,这是唯一的方法。在 Rest API 上允许 session 身份验证会导致 CSRF 安全问题,因此您需要有一个代理层来获取用户 session 、从 session 中检索访问 token 并向 Rest API 添加 Authorization
标题。
CORS
使用此方法,您需要将用户访问 token 存储在 localStorage 中,因为 token 是直接从 Js 客户端检索的。
使用 CORS,您可以确定其他网站无法从浏览器向您的 Rest API 发出请求。但是您的第一个客户端需要公开(即:它没有 client_secret
)。
在我的第一个应用程序中,我尝试使用您建议的相同机制来保护身份验证流程。然而,这种机制要求您以唯一的方式识别每个用户客户端。这在 iOS 中是不可能的 privacy reasons并且有可能在未来的 Android 版本中被拒绝。因此,您应该依赖公共(public)客户端并在您的 native 应用程序代码中仅添加 client_id
。
也就是说你的native app client/你的js client可以非个性化?
是的,并且无法通过 oAuth2 资源所有者密码凭据授予类型来防止这种情况。
主要是因为oAuth2不是为了鉴权,只是为了第三方授权,并且添加了grant type只是为了特定的第三方应用可信到足以直接使用用户密码。你可以阅读更多关于这个论点的信息 here和 here .
您仍然需要一种方法来授权您的用户,我认为使用 oAuth2 可以实现的最佳效果是 Auth0做过。本质上,此 SaaS 使用 oAuth2 服务器 + OpenID 连接管理您的用户,因此您始终像管理第三方应用程序一样管理您的用户,并且一切正常。
的确,你可以在this page上看到对于移动应用程序,他们建议使用基于浏览器的登录表单,因为反编译您的应用程序的每个人都可以将原生表单非个性化,但如果您将其包装到授权代码流中,它就可以正常工作。
关于javascript - 公共(public)第一方客户端的正确 OAuth2 流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37200642/
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
首先是一些背景;我们正在开发一个数据仓库,并对我们的 ETL 过程使用哪些工具进行一些研究。该团队非常以开发人员为中心,每个人都熟悉 C#。到目前为止,我已经看过 RhinoETL、Pentaho (
我需要具有管理员权限的进程。从this问题和答案来看,似乎没有比启动单独进程更好的方法了。因为我宁愿有一个专用于该过程的过程,而不是仅为此方法在第二个过程中启动我的原始应用程序–我以为我会在VS201
我有这个函数来压平对象 export function flattenObject(object: Object, prefix: string = "") { return Object.key
我正在开发一个基于java的Web应用程序,它要求我使用来自SIP( session 启动协议(protocol))消息的输入生成序列图。我必须表示不同电话和相应服务器之间的调用流程。我可以利用任何工
这是我的代码: Process p=Runtime.getRuntime().exec("something command"); String s; JFrame frame = new JFram
我对 istio 的 mTLS 流程有点困惑。在bookinginfo 示例中,我看到服务通过http 而不是https 进行调用。如果服务之间有 mTLS 那么服务会进行 http 调用吗? 是否可
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
之前做过一个简单的纸牌游戏,对程序的整体流程有自己的想法。我最关心的是卡片触发器。 假设我们有一张名为“Guy”的牌,其效果为“每当你打出另一张牌时,获得 2 点生命”。我将如何将其合并到我的代码中?
我有 4 个 Activity 。 A、B、C 和 D。 用户可以从每个 Activity 开始任何 Activity 。 即 Activity A 有 3 个按钮来启动 B、C 和 D。以同样的方式
我做了一个简单的路由器类,简化后看起来像这样 // @flow import { Container } from 'unstated' type State = { history: Objec
我有两个 Activity ,比如 A1 和 A2。顺序为 A1->A2我从 A1 开始 A2 而没有在 A1 中调用 finish() 。在 A2 中按下后退按钮后,我想在 A1 中触发一个功能。但
我正在考虑在我的下一个项目中使用 BPEL。我试用了 Netbeans BPEL 设计器,我对它很满意。但在我决定使用 BPEL 之前,我想知道它对测试驱动开发的适用程度。不幸的是,我对那个话题知之甚
我需要将两个表格堆叠在一起,前后都有内容。我无法让后面的内容正常流动。堆叠的 table 高度可变。 HTML 结构: ... other content ...
我是 Hibernate 的新手。我无法理解 Hibernate 的流程。请澄清我的疑问。 我有“HibernateUtil.java ”和以下语句 sessionFactory = new Anno
早上好 我开始使用 Ruby,想创建一个小工具来获取我的公共(public) IP 并通过电子邮件发送。我遇到了字符串比较和无法处理的 if/else block 的基本问题。 代码非常简单(见下文)
我目前正尝试在我的团队中建立一个开发流程并阅读有关 GitFlow 的信息。它看起来很有趣,但我可以发现一些问题。 让我们假设以下场景: 我们完成了 F1、F2 和 F3 功能,并将它们 merge
我已经使用 git flow 有一段时间了。我很想了解一个特定的用例。 对于我的一个项目,我有一张新网站功能的门票。此工单取决于许多子任务。我想为主工单创建一个功能分支,然后为每个子任务创建一个脱离父
简介 "终结"一般被分为确定性终结(显示清除)与非确定性终结(隐式清除) 确定性终结主要 提供给开发人员一个显式清理的方法,比如try-finally,using。
你怎么知道在一个程序中已经发现并解决了尽可能多的错误? 几年前我读过一篇关于调试的文档(我认为这是某种 HOWTO)。其中,该文档描述了一种技术,其中编程团队故意将错误添加到代码中并将其传递给 QA
我是一名优秀的程序员,十分优秀!