【问题标题】:What is OAuth and how does it secure REST API calls? [closed]什么是 OAuth,它如何保护 REST API 调用? [关闭]
【发布时间】: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??

标签: api rest authentication oauth oauth-2.0


【解决方案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 登录为例进行说明。

背景; 在解释图表之前,请考虑您已完成以下操作:

  1. 您在 Facebook 开发者门户中注册了一个应用程序。
  2. Facebook 为您提供两个代码,1) secret_key 和 2) app_id
  3. 您设计了一个按钮,上面写着Login with Facebook

现在是图表:

  1. 客户端请求 API 服务器。
  2. API 服务器重定向到登录页面说。 To access the data: please login with facebook to access the page
  3. 用户单击login with Facbook 按钮,将打开一个新的弹出窗口OAuth dialog。询问 Facebook 用户名和密码。
  4. 用户输入他的用户名和密码,然后允许访问您的应用程序。 auth server 使用代码作为 URL 中的参数将用户重定向到您的网站。
  5. API Server步骤 4 上被调用,API server 从 URL 捕获代码。
  6. API 服务器 使用提供的client_secret 调用 auth 服务器
  7. Auth server返回access token供用户访问API Server。
  8. API 服务器auth 服务器 询问给定 access token 的用户信息。
  9. 身份验证服务器返回有关用户、个人资料图片、电子邮件等的详细信息。
  10. API 服务器 识别用户,将响应连同访问令牌一起发送给他。
  11. 客户端在下一次请求时将访问令牌发送到 api 服务器
  12. API 服务器检查访问令牌是否有效并做出响应。
  13. 访问令牌过期后,客户端会被要求重新登录。

现在,这如何保护您的 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 的唯一用例吗?
猜你喜欢
  • 2017-07-30
  • 2013-11-28
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2013-12-20
  • 2016-01-09
  • 2020-07-24
  • 2014-12-24
相关资源
最近更新 更多