我正在为一个应用程序构建一个REST API,它完全依赖于这个API(根本就没有前端)。所以我发现自己在2分中苦苦挣扎:
1。如何使用REST实现身份验证/注册并执行需要auth的操作?
嗯,我知道像Instagram这样的应用程序有一个特殊页面,用户可以生成 access_token 并使用Instagram API而不受限制(需要auth)。但就我而言,我所能做的就是创建一个这样的REST请求
?action=generateToken&userName=someName&password=somePassword
如果用户名和密码正确,我想将 access_token 作为回复。 同样在这里注册
?action=register&userName=someName&password=somePassword
在这里,我收到了问候语和 access_token
问题是我应该如何通常使用这些令牌来存储,生成,刷新,操作?我应该有一个单独的数据库,其中存储令牌本身和相关用户(id)?当然,我应该在N分钟后删除这些令牌。我应该多久存储一个令牌?否则,任何以某种方式窃取令牌的人都可以访问所有用户的功能。我怎么能这样做?
如果我做得对,任何需要用户识别的行动都可以这样做
?action=sendMessage&access_token=someToken&recipientId=100&message=TestAuthOut!
其中 access_token 是生成的令牌
2。如何形成一个包含对象数组作为输入的REST请求?我的意思是执行以下操作:
?action=createNewVetClinic&vetClinicName=someName&doctors={doctor1: name = "doctor1", occupation="surgeon", salary=100}, {doctor2: name = "doctor2", occupation="dentist", salary=80}
是否可以创建这样的请求?我知道非常的菜鸟问题,但无论如何
答案 0 :(得分:0)
保护REST应用程序的一般共识是在HTTP标头中而不是在请求有效负载中发送凭证或访问令牌,并将它们包含在每个请求中,因为REST应该是无状态协议。 Authorization
标头通常用于此格式,其格式为Authorization: <Scheme> <Payload>
,其中<Scheme>
是授权方案,<Payload>
通常与方案有关。常用的授权方案包括:
Basic <base-64-encoded-credentials>
此方案的有效负载是格式为<username>:<password>
的Base64编码凭据。应用程序应检查标头,提取凭据,并根据凭据存储(您的用户数据库或诸如此类)验证它们。此方法的缺点是凭据以纯文本形式发送到服务器;但是,强制HTTPS协议访问REST API可以在很大程度上缓解这一弱点。
Bearer <token>
通常用于提供以前生成的访问令牌。它们的优点是在生成访问令牌后不需要将凭证发送到服务器。同样,应用程序检查令牌,从中提取用户授权信息,并基于此授权用户。如果您的应用程序在服务器端维护用户会话,那么您可以使用此方案发送会话令牌;但是,不推荐这种方法,因为它不可扩展。相反,可以使用各种加密方法将用户认证信息嵌入到访问令牌本身中,以便可以在服务器上解密和验证令牌,而不需要会话存储,同时仍然高度抵抗客户端上的篡改侧。常见的此类方法包括SAML和(我最喜欢的)JWT。所有使用承载的方案都依赖于某种/generate-access-token
API端点。
至于如何以集中方式拦截和授权所有API请求,我可以将您引用到my earlier answers之一(它特定于Spring Boot,但也可以很容易地适应普通的Spring MVC应用程序)