什么是OAuth,它如何保护REST API调用?

21

我有一个移动应用程序的REST API调用,它在没有任何令牌或安全机制的情况下命中我的服务器。

我想要保护我的API调用。我正在尝试了解OAuth是什么以及它如何保护我的移动应用程序REST API调用,这些调用正在命中我的服务器?

此外,我想详细了解OAuth中使用的以下字段,以及我将从哪里获取以下字段。

Consumer Key
Consumer Secret
Token
Token Secret
Timestamp
Nonce

1
阅读OAuth规范。 - PeeHaa
我读了它,但是我没有理解,所以我在这里发了问题... - Sanjay Salunkhe
你能分享一下 OAuth 的链接吗?以及如何在移动应用中实现它来保护 API? - Sanjay Salunkhe
1个回答

43

由于大多数服务提供商使用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服务器上交换为访问令牌。
  • 访问令牌: 一个标识用户的字符串,通常带有过期时间。
  • 消费者密钥或APP_ID:用于认证服务器识别您的应用程序的公钥。
  • 消费者秘钥或APP_SECRET: 应保密的私钥。

以下术语与OAuth无关,但与OAuth一起使用可使其更加安全。

  • 时间戳:表示日期和时间的字符串。
  • Nonce:一个只能使用一次的数字或字符串。

enter image description here
源代码: http://smerity.com/

我将以Facebook登录为例,解释此图表。

背景: 在解释图表之前,请考虑以下步骤:

  1. 您在Facebook开发人员门户注册了一个应用程序。
  2. Facebook提供您的两个代码,1)一个secret_key和2)一个app_id
  3. 您设计了一个按钮,上面写着“使用Facebook登录”。

现在是图表:

  1. 客户端请求API服务器。
  2. API服务器重定向到登录页面,显示“要访问数据:请使用Facebook登录以访问页面”。
  3. 用户单击“使用Facbook登录”按钮,打开新弹出窗口“OAuth对话框”,要求输入Facebook用户名和密码。
  4. 用户输入用户名和密码,然后允许访问您的应用。 auth server 通过URL中的参数将代码作为参数将用户重定向到您的网站。
  5. API服务器第4步时被调用,API服务器 从URL中获取代码。
  6. API服务器 使用提供的client_secret调用认证服务器
  7. Auth服务器 返回用户的访问令牌给API服务器。
  8. API服务器 请求认证服务器以获取给定访问令牌的用户信息。
  9. Auth服务器 返回有关用户的详细信息,如个人资料图片、电子邮件等。
  10. API服务器 标识用户,将响应与访问令牌一起发送给用户。
  11. 客户端 在下一次请求中向API服务器发送访问令牌。
  12. API服务器 检查访问令牌是否有效并作出响应。
  • 当访问令牌过期后,客户端被要求重新登录。
  • 现在,这如何保护您的API?

    将需要安全的部分设置为需要登录才能访问。如果发出请求的客户端未登录到您的API,则将其发送到图表的第二个步骤。

    那么,nonce是什么?时间戳呢?

    如果有人窃取了访问令牌,则只要访问令牌过期,他就可以访问API服务器。因此,当用户请求页面时,服务器会将一个nonce返回给客户端,该nonce存储在服务器中。客户端使用接收到的nonce对请求进行签名并完成请求。由于nonce仅使用一次,因此服务器将删除nonce。当攻击者获取nonce并向服务器发送假请求时,服务器将拒绝请求,因为一次性数字无效,已经被使用过了。

    TimeStamp用于识别生成令牌或nonce的时间,并在有限的时间范围内(1-2秒)将其过期,这是完成请求所需的时间。


    2
    我有一个关于这种方法的问题,涉及到安全性。如果将来自Facebook的代码作为参数发送到URL中,那么一些恶意代码不就可以捕获并使用它来冒充其他人进行身份验证吗? - buydadip
    1
    @Bolboa 任何能够访问网络数据包和日志的人都可以捕获代码,因此请使用HTTPS。由于该代码是为特定用户和特定应用程序(我们的应用程序)生成的,因此该代码无法用于验证任何其他用户对任何其他应用程序的身份,这就是使用秘密应用凭据的地方。Facebook内部;) - All Іѕ Vаиітy
    1
    @AllІѕVаиітy 请问我能否在不使用oAuth的情况下使用REST API呢? - Gem
    1
    @AllІѕVаиітy 如果我有一个 REST API,只会被我的前端客户(浏览器和移动设备)使用,没有第三方应用程序参与。OAuth2.0 是正确的工具吗?我知道有 From 和 Basic 认证。但是 OAuth2.0 只适用于社交登录吗? - The Coder

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接