当前位置: 首页 > 面试题库 >

REST API授权和认证(Web +移动)

邓元白
2023-03-14
问题内容

我已经阅读了有关oAuth,AmazonRESTAPI,HTTPBasic/Digest等的信息,但无法将其全部整合为“单个”。这可能是最接近的情况- 为移动应用程序创建API-
身份验证和授权

我想建立以API为中心的网站-服务。因此(一开始)我将在中心拥有一个API,而 网站 (PHP + MySQL)将通过 cURL
AndroidiPhone
通过它们的网络接口进行连接。所以3个主要客户-3个API密钥。其他开发人员也可以通过API接口进行开发,他们将获得自己的API密钥。根据用户级别的状态,API操作将被接受/拒绝,如果我是管理员,则可以删除任何内容,等等,其他所有操作都只能操作其本地(帐户)数据。

首先,授权-我应该使用oAuth +xAuth还是我自己的某种实现?据我了解,
Amazon服务用户是== API用户(具有API密钥)
。在我的服务中,我需要区分标准用户/帐户(在网站上注册的用户)和开发者帐户(应具有其API密钥)。

因此,我首先需要 授权API密钥 ,然后再 验证用户
本身。如果我使用亚马逊的方案来检查开发人员的API密钥(授权他们的应用程序),那么我应该使用哪个sheme进行用户身份验证?

我读到有关通过api.example.org/auth(通过 HTTPS ,HTTP
Basic)发布我的用户名和密码,然后在随后的每个请求中转发令牌的方式获得令牌的信息。如果我同时在 Android网站
上登录,如何管理令牌?如果我仅在第一个请求(传输用户名和密码时使用SSL)并且仅在其他请求上使用HTTP时,使用中间人攻击怎么办?


问题答案:

总而言之,保护密钥的最佳方法是不传输密钥。

也就是说,我们通常使用一种方案,其中每个“ API密钥”都有两个部分:非秘密ID(例如1234)和秘密密钥(例如byte [64])。

  • 如果提供API密钥,请将其(加盐和散列)存储在服务的数据库中。
  • 如果提供用户帐户(受密码保护),则将密码(加盐和散列)存储在服务的数据库中

现在,当消费者 首次 访问您的API进行连接时,请他

  • 发送“用户名”参数(“ john.doe”不是秘密)
  • 发送“ APIkeyID”参数(“ 1234”,不是秘密)

还给他

  • 数据库中的盐(如果其中一个参数错误,只需返回一些可重复的盐-例如sha1(username +“ notverysecret”)。
  • 服务器的时间戳

消费者应在会话期间存储盐,以使事情变得快速顺畅,并且他应计算并保持客户端与服务器之间的时间偏移。

消费者现在应该计算API密钥和密码的哈希值。这样,使用者就可以使用与存储在数据库中的密码和API密钥完全相同的哈希值,而不会遇到任何秘密问题。

现在,当消费者 subseqently 访问您的API,做实事,让他

  • 发送“用户名”参数(“ john.doe”不是秘密)
  • 发送“ APIkeyID”参数(“ 1234”,不是秘密)
  • 发送“ RequestSalt”参数(字节[64],随机,不是秘密)
  • 发送“ RequestTimestamp”参数(根据客户端时间和已知偏移量计算)
  • 发送“ RequestToken”参数(哈希(密码哈希+ request_salt + request_timestamp + apikeyhash))

服务器不应接受过去超过2秒钟的时间戳记,以使其免受重放攻击的影响。

服务器现在可以计算与客户端相同的哈希(passwordhash + request_salt + request_timestamp +
apikeyhash),并确保

  • 客户端知道API密钥,
  • 客户知道正确的密码


 类似资料:
  • 主要内容:1. 前提条件,2. 配置工作,3. 允许多人进入,4. 可能的问题,5. 替代密码存储,6. 使用多个供应者,7. 超越授权身份验证是验证访问者是否是他们所声称的人的任何过程。授权是允许访问者进入他们想去的地方或获得他们想要的信息的过程。 如果您的网站上的信息仅对一小部分人使用,下面这些技巧将帮助您确保看到这些网页的人员是您想要查看的人。 本文还将介绍保护大多数人将要使用的网站部分的“标准”方法。 1. 前提条件 本文中讨论的指令需要在主服务器配置文件(通常在部分中)或每目录配置文件

  • Serenity 使用一些抽象(abstractions)来与你的应用程序自身的用户身份验证和授权机制一起工作。 Serenity.Abstractions.IAuthenticationService Serenity.Abstractions.IAuthorizationService Serenity.Abstractions.IPermissionService Serenity.Abst

  • 请求地址 https://api.es.xiaojukeji.com/river/Auth/authorize 返回数据格式 JSON 请求方式 POST 是否需要登录 否 访问授权限制 调用方访问授权后,将返回的授权信息缓存半小时(缓存过期或调用服务时返回401=>access_token不合法或已过期,再重新申请授权),不要每次调用接口都申请一次授权。 请求参数 名称 类型 必选 描述 cli

  • 说明 调用方访问授权后,将返回的授权信息缓存半小时(缓存过期或调用服务时返回401=>access_token不合法或已过期,再重新申请授权),不要每次调用接口都申请一次授权。 地址URL /v1/Auth/authorize 支持格式 Json或普通form HTTP请求方式 POST 是否需要登录 否 请求参数 名称 类型 必选 描述 client_id string yes 申请应用时分配的

  • 问:什么是认证(authentication)? 认证是为了解决"你是谁"的问题。 问:什么是授权(authorization)? 授权是为了解决"你是否有权限"的问题,只有在认证通过之后,才会进行权限检查。 问:SDS是如何认证的? SDS采用了融合云/生态云平台的认证方式,和平台上其他服务相同。 问:融合云SDS是如何认证的? 融合云有org/team/user三个概念,org是资源(表)的拥

  • Authentication, authorization, and permissions (认证,授权和权限) Access control concepts (访问控制的概念) General process (一般流程) Exposing and hiding models, methods, and endpoints (揭露和隐藏模式,方法和触发点) Hiding methods an