php resf验证,REST API上的用户注册/身份验证流程

我知道这不是第一次在StackOverflow中处理该主题,但是我有一些问题我找不到答案或其他问题有反对的答案.

我正在做一个相当简单的REST API(Silex-PHP),最初由一个SPA(骨干应用程序)消费.我不想评论这个问题中的所有几种身份验证方法,因为该主题已经在SO中完全覆盖.我将基本上为每个用户创建一个令牌,并且这个令牌将被附加在需要SPA验证的每个请求中.所有SPA-Server事务将在HTTPS下运行.现在,我的决定是令牌不会过期.每个会话到期/令牌的令牌不符合REST的无状态,对吗?我知道有很多安全改进的余地,但这是我现在的范围.

我有一个令牌的模型,因此在数据库中有一个用于具有FK到user_id的令牌的表.这样我的意思是令牌不是我的用户模型的一部分.

寄存器

我有一个POST /用户(不需要验证)在数据库中创建一个用户并返回新的用户.这符合一个请求一个资源规则.但是,这给我带来了一些疑问:

>我的想法是,在创建新用户时,为用户创建一个新的令牌,立即返回响应,从而改进UX.用户将立即开始使用网络应用程序.然而,返回这样的响应的令牌将会破坏返回资源的规则.我应该一起做两个请求吗?一个用于创建用户,一个用于在用户需要重新输入凭据的情况下检索该令牌?

>如果我决定与用户一起返回令牌,那么我相信POST /用户会对API消费者感到困惑,然后会出现像POST / auth / register这样的东西.再一次,我不喜欢这个想法,因为涉及一个动词.我真的很喜欢this answer中提供的简单性,但是再次,我需要一起做两个请求,一个POST /用户和一个POST /令牌.如果两个请求一起发送,一起执行两个请求也有错误,如果两个请求一起发送,我将如何精确地发送要附加到某个用户的令牌的相关信息?

现在我的流程如下:

1. Register form makes a POST /users request

2. Server creates a new user and a new token,returns both in the response (break REST rule)

3. Client now attaches token to every Request that needs Authorization

令牌永远不会过期,保留REST无状态.

电子邮件验证

大多数当前的webapps需要电子邮件验证,而不会破坏用户的UX,即用户可以在注册后立即使用webapp.另一方面,如果我用上面提出的注册请求返回令牌,用户将立即访问每个资源,而无需验证电子邮件.

通常我会去下面的工作流程:

1. Register form sends POST /users request.

2. Server creates a new user with validated_email set to false and stores an email_validation_token. Additionally,the server sends an email generating an URL that contains the email_validation_token.

3. The user clicks on the URL that makes a request: For example POST /users/email_validation/{email_validation_token}

4. Server validates email,sets validated_email to true,generates a token and returns it in the response,redirecting the user to his home page at the same time.

这看起来过于复杂,完全破坏了UX.你怎么去的?

这很简单,现在我这样做,所以请纠正我错了:

1. User fills a log in form which makes a request to POST /login sending Basic Auth credentials.

2. Server checks Basic Auth credentials and returns token for the given user.

3. Web app attached the given token to every future request.

login是一个动词,因此打破了一个REST规则,每个人似乎都同意这样做.

登出

为什么每个人似乎都需要一个/ auth / logout端点?从我的角度来看,点击Web应用程序中的“注销”应该基本上从应用程序中删除令牌,而不是发送进一步的请求.服务器在这方面没有任何作用.

由于令牌可能保留在localStorage中,以防止在可能的页面刷新时丢失令牌,注销也意味着从localStorage中删除令牌.但是,这并不影响服务器.我了解需要POST /注销的人员基本上使用会话令牌,这再次打破了REST的无状态.

记住我

我明白,记住我基本上是指将返回的令牌保存到本地或不在我的情况下.这是正确的吗?

如果你建议对这个话题进一步的阅读,我将非常感谢.谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值