什么是 OAuth,它如何保护 REST API 调用? [关闭]
Posted
技术标签:
【中文标题】什么是 OAuth,它如何保护 REST API 调用? [关闭]【英文标题】:What is OAuth and how does it secure REST API calls? [closed] 【发布时间】:2016-10-07 01:21:47 【问题描述】:我的移动应用程序 REST API 调用在没有任何令牌或安全机制的情况下访问我的服务器。
我想保护我的 API 调用。我想了解什么是 OAuth 以及它将如何保护我的移动应用程序 REST API 调用,这些调用会访问我的服务器?
我还想详细了解 OAuth 中使用的以下字段。我将从哪里获得以下字段。
Consumer Key
Consumer Secret
Token
Token Secret
Timestamp
Nonce
【问题讨论】:
阅读 oauth 规范。 我读过但没明白这就是为什么我在这里发布问题.... 你能与我分享 oauth 的链接吗?如何在移动应用中实现这一点以保护 api?? 【参考方案1】:由于大多数提供商使用 OAuth 2.0,而 OAuth 1.0 已被主要提供商弃用,我将解释 OAuth2.0
什么是 OAuth?
OAuth 是一种开放的授权标准,通常用作互联网用户使用其 Microsoft、Google、Facebook、Twitter、One Network 等帐户登录第三方网站而不暴露其密码的一种方式。
您可以实现自己的 OAuth 服务器,这里我将解释社交身份验证。所以后面的 OAuth 一词是指使用 OAuth 的社交身份验证。
通俗地说,OAuth 允许用户使用帐户(Facebook、Google 等)登录您的网络服务。
术语:
客户端:您的 API 的用户。 资源所有者(api 服务器):您的 API 授权服务器(认证服务器): Facebook/Google 等认证服务器。 授权授予:您授权用户的方法。我们在这里使用授权码。 授权码:授权服务器返回给客户端的代码,可以在api服务器交换访问令牌。 访问令牌:标识用户的字符串,通常带有有效期。 Consumer Key or APP_ID:身份验证服务器用来识别您的应用程序的公钥。 Consumer Secret 或 APP_SECRET: 应保密的私钥。以下术语与 OAuth 无关,但与 OAuth 一起使用以使其更安全。
时间戳:表示日期和时间的字符串。 Nonce:只能使用一次的数字或字符串。来源:http://smerity.com/
我将以 Facebook 登录为例进行说明。
背景; 在解释图表之前,请考虑您已完成以下操作:
-
您在 Facebook 开发者门户中注册了一个应用程序。
Facebook 为您提供两个代码,1)
secret_key
和 2) app_id
您设计了一个按钮,上面写着Login with Facebook
。
现在是图表:
-
客户端请求 API 服务器。
API 服务器重定向到登录页面说。
To access the data: please login with facebook to access the page
用户单击login with Facbook
按钮,将打开一个新的弹出窗口OAuth dialog
。询问 Facebook 用户名和密码。
用户输入他的用户名和密码,然后允许访问您的应用程序。 auth server 使用代码作为 URL 中的参数将用户重定向到您的网站。
API Server 在步骤 4 上被调用,API server 从 URL 捕获代码。
API 服务器 使用提供的client_secret
调用 auth 服务器
Auth server返回access token
供用户访问API Server。
API 服务器 向 auth 服务器 询问给定 access token
的用户信息。
身份验证服务器返回有关用户、个人资料图片、电子邮件等的详细信息。
API 服务器 识别用户,将响应连同访问令牌一起发送给他。
客户端在下一次请求时将访问令牌发送到 api 服务器。
API 服务器检查访问令牌是否有效并做出响应。
访问令牌过期后,客户端会被要求重新登录。
现在,这如何保护您的 api?
将需要安全的部分设置为需要登录才能访问它们。如果发出请求的客户端没有登录到您的 api,请将他发送到图表的第 2 步。
那么什么是随机数?时间戳?
如果有人窃取了访问令牌,只要访问令牌过期,他就可以访问 API 服务器。因此,当用户请求页面时,服务器会向他发送一个存储在服务器中的随机数。客户端使用收到的 nonce 对请求进行签名并完成请求。由于 nonce 只使用一次,服务器会删除 nonce。当攻击者获取 nonce 并向服务器发出虚假请求时,服务器将拒绝该请求,因为该一次数字已使用无效。
TimeStamp 用于标识创建令牌或随机数的时间,用于在有限的时间范围(1-2 秒)内使令牌或随机数过期,即完成请求所需的时间。
【讨论】:
我对这种方法有一个问题,就安全性而言。如果来自 Facebook 的 代码 作为参数发送到 URL,难道一些恶意代码不能捕获它并使用它来验证自己是否为其他人吗? @Bolboa 任何可以访问网络包和日志的人都可以捕获代码,所以使用HTTPS。由于代码是为特定应用程序(我们的应用程序)的特定用户生成的,因此该代码不能用于向任何其他应用程序验证任何其他用户,这是秘密 App Credentials 所在的位置用过的。 Facebook 内部 ;) @AllІѕVаиітy 我可以在没有 oAuth 的情况下使用 REST API 吗? @AllІѕVаиітy 如果我有一个仅由我的前端客户端(浏览器和移动设备)使用且不涉及第三方应用程序的 REST API。 OAuth2.0 是正确的工具吗?我知道 From 和 Basic 身份验证在那里。但是社交登录是 OAuth2.0 的唯一用例吗?以上是关于什么是 OAuth,它如何保护 REST API 调用? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何实现FosOAuthServerBundle来保护REST API?
使用 OAuth2.0 或 Azure Active Directory 保护 REST API
如何在使用 OAuth2 社交登录保护 REST API 的同时配置 Spring Boot 登录页面
如何使用 WebClient 使用 oauth2 安全的 REST API?