RESTFUL API 中的多次登录

Posted

技术标签:

【中文标题】RESTFUL API 中的多次登录【英文标题】:Several logins in RESTFUL API 【发布时间】:2013-06-25 02:30:32 【问题描述】:

我们正在设计一个需要支持多种登录服务的 RESTFUL API。

Custom login:  ptgapi/v1/clients/clientId/users?mode=custom
FB login:      ptgapi/v1/clients/clientId/users?mode=facebook
Twitter login: ptgapi/v1/clients/clientId/users?mode=twitter
LinkedIn login: ptgapi/v1/clients/clientId/users?mode=linkedin
Create user:   ptgapi/v1/clients/clientId/users

我们在服务之上有一个 Spring 集成层,因此根据提供的路径,需要激活其中一项服务。

我们的想法是让路由器捕获入站网关输入并根据有效负载值重定向流。

<int-http:inbound-gateway id="v1.login.inbound.gateway" path="/ptgapi/apiVersion/clients/clientId/users" .../>

但这里的“创建用户”与其他的路由过程相同......我认为这是一种难闻的气味。

通过更好的关注点分离是否有更好的方法来获得它?

谢谢!

【问题讨论】:

【参考方案1】:

服务可能具有相同的路径/路由,但它们由操作标识。在 REST 中,您将拥有相同的服务路径,但根据您正在执行的操作类型,HTTP 方法会有所不同。您可以使用 POST 和 PUT HTTP 方法区分您的登录并创建服务。

就个人而言,我认为 PUT 是更好的选择,因为 PUT 提供了更多控制权,例如:

您是明确命名您创建的 URL 对象,还是让服务器决定?如果您命名它们,则使用 PUT。如果您让服务器决定,请使用 POST。 PUT 是幂等的,所以如果你 PUT 一个对象两次,它就没有效果。这是一个不错的属性,所以我会尽可能使用 PUT。 您可以使用具有相同对象 URL 的 PUT 更新或创建资源

更多关于 PUT 与 POST 的信息

PUT 意味着放置一个资源 - 用不同的东西完全替换给定 URL 上可用的任何东西。根据定义,PUT 是幂等的。你喜欢做多少次,结果都是一样的。 x=5 是幂等的。无论之前是否存在,您都可以 PUT 资源(例如,创建或更新)!

POST 更新资源、添加辅助资源或导致更改。 POST 不是幂等的,就像 x++ 不是幂等一样。

【讨论】:

你的意思是在登录中使用PUT(因为修改了token),在创建中使用POST? @antacerod 不,我在想别的办法。 PUT 用于创建实体, POST 用于登录。我正在分享一些 SO 链接来支持它:-) 好的。我明白你的意思......我对 REST 的概念有误。我会听从你的建议。谢谢,很好的回答!【参考方案2】:

对于用户 CRUD,您应该有一个类似 ptgapi/v1/clients/clientId/users 的路由,并按应有的方式使用 HTTP 方法:GET 用于返回用户,PUT 用于创建用户,POST 用于更新用户并 DELETE 将其删除。

登录操作本身不是用户实体操作。您应该有另一条路线,就像 ptgapi/v1/clients/login 并通过 POST 传递登录参数(最好加密)。

【讨论】:

谢谢亚历山大。这是区分登录和创建的好选择。我会记住的! REST 身份验证是一个公开辩论。没有一成不变的最佳实践。记住这一点。【参考方案3】:

创建用户是一个动作,所以也许你可以定义一个新的路由,比如

Create user:   ptgapi/v1/clients/clientId/users/new

或类似的东西。

【讨论】:

我有想过,但是从严格的restify角度来看,创建新用户的操作必须是我在帖子中所说的......你不认为问题是与登录路径而不是创建用户更相关? 对于这个设计,我点击了以下链接:***.com/questions/4608225/… 简单问题:“创建用户”是为特定服务创建用户还是一般用户(针对指定客户端)? 是一个通用的,因为将在多个服务中使用。你为什么问它?

以上是关于RESTFUL API 中的多次登录的主要内容,如果未能解决你的问题,请参考以下文章

RESTful API 中的会话 [重复]

RESTful API - 控制对 API 的访问(没有登录页面)

使用 RESTful 登录 API 验证我的 Spring Boot 应用程序

如何使用 Spring Security 做一个 RESTful 登录 API?

细说Restful API之幂等性

使用 MEAN.js Restful 无会话 API 后端的 Oauth 社交登录