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

San*_*khe 9 authentication api rest oauth oauth-2.0

我有移动应用程序REST API调用,无需任何令牌或安全机制即可访问我的服务器.

我想保护我的API调用.我正在尝试了解什么是OAuth以及它如何保护我的移动应用REST API调用到我的服务器?

另外,我想详细了解OAuth中使用的以下字段.我将从哪里到达田野.

Consumer Key
Consumer Secret
Token
Token Secret
Timestamp
Nonce
Run Code Online (Sandbox Code Playgroud)

All*_*ітy 23

由于大多数提供商都使用OAuth 2.0,OAuth 1.0已被主要提供商弃用,我将解释OAuth2.0

什么是OAuth?

OAuth是一种开放的授权标准,通常用作互联网用户使用其Microsoft,Google,Facebook,Twitter,One Network等帐户登录第三方网站的方式,而不会泄露其密码.

你可以实现自己的OAuth服务器,我在这里解释社交认证.所以OAuth后面的术语是指带有OAuth的社交认证.

通俗地说,OAuth允许用户使用帐户(Facebook,Google等)登录您的Web服务.

术语:

  • 客户:您的API的用户.
  • 资源所有者(api服务器):您的API
  • 授权服务器(auth服务器): Facebook/Google等auth服务器.
  • 授权授权:授权用户的方法.我们在这里使用授权代码.
  • 授权代码: auth服务器返回给客户端的代码,可以在api服务器上交换访问令牌.
  • 访问令牌:标识用户的字符串,通常带有到期时间.
  • 使用者密钥或APP_ID: auth服务器用于标识您的应用程序的公钥.
  • 消费者秘密或APP_SECRET:应保密的私钥.

以下条款与OAuth无关,但与OAuth一起使用可使其更安全.

  • 时间戳:一个告诉日期和时间的字符串.
  • Nonce:一个只能使用一次的数字或字符串.

在此输入图像描述
来源:http://smerity.com/

我将用Facebook登录作为示例解释图表.

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

  1. 您在Facebook开发者门户网站上注册了一个应用
  2. Facebook为您提供两个代码,1)a secret_key和2)anapp_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将打开一个新的弹出窗口.要求用户名和密码.
  4. 用户输入他的用户名和密码,然后允许访问您的应用程序.auth服务器使用代码作为URL中的参数将用户重定向到您的网站.
  5. API服务器被称为在步骤4中,API服务器从URL捕获代码.
  6. API服务器使用提供的调用auth服务器client_secret
  7. Auth服务器返回给access token用户的API服务器.
  8. API服务器auth 服务器请求给定的用户信息access token.
  9. Auth Server返回有关用户,个人资料照片,电子邮件等的详细信
  10. API服务器识别用户,向他发送响应以及访问令牌.
  11. 客户端在下次请求时将访问令牌发送到api服务器.
  12. API服务器检查访问令牌是否有效并作出响应.
  13. 当访问令牌过期时,要求客户端再次登录.

现在,这如何保护您的api?

将需要安全性的部分作为登录访问它们.如果发出请求的客户端未登录到您的api,请将其发送到图表的第2步.

什么是nonce?时间戳?

如果有人窃取访问令牌,只要访问令牌过期,他就可以访问API服务器.因此,当用户请求页面时,服务器向他发回存储在服务器中的随机数.客户使用收到的现时签署请求并完成请求.由于nonce仅使用一次,因此服务器删除nonce.当攻击者抓取现时并向服务器发出虚假请求时,服务器拒绝该请求,因为一次性号码已经无效.

TimeStamp用于标识创建令牌或随机数的时间,该时间用于在有限的时间范围内(1-2秒)使令牌或随机数到期,这是请求完成所需的时间.

  • 就安全性而言,我对这种方法有一个疑问。如果来自 Facebook 的**代码**作为参数发送到 URL,某些恶意代码是否不能捕获该代码并使用它来以其他人的身份验证自己的身份? (2认同)