求重置密码的解决方案

找了半天社区没找到合适的密码重置的解决方案。
要求:前后端分离,输入邮箱和修改密码为前端页面。
服务端只处理发送邮件和修改密码。
希望服务端发送的验证地址是vue的前端页面,不是集成在laravel项目里面的blade页面。

服务端我用passwordbroker生成了token。发送到了邮件中

Laravel

但是这个token跟password_resets中的token完全不一样。如果是前端页面重置密码,怎么识别是哪个用户在重置密码呢
DB:

Laravel

还是吧这个passwordbroker生成的token跟用户邮箱绑定自己存一份映射数据?

因为我没有使用auth内置的前端页面。只是想提供api。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

感谢大家的回答,最后还是使用了部分broker的验证逻辑,本来想通过broker生成的token直接能换取到重置密码的用户,但是看了broker的源码貌似没有这个能力。 用户在重置密码的时候还是必须要把email传递过来,并不是直接通过token来获取时哪个用户。

 /**
     * Get the user for the given credentials.
     *
     * @param  array  $credentials
     * @return \Illuminate\Contracts\Auth\CanResetPassword|null
     *
     * @throws \UnexpectedValueException
     */
    public function getUser(array $credentials)
    {
        $credentials = Arr::except($credentials, ['token']);

        $user = $this->users->retrieveByCredentials($credentials);

        if ($user && ! $user instanceof CanResetPasswordContract) {
            throw new UnexpectedValueException('User must implement CanResetPassword interface.');
        }

        return $user;
    }

file
broker内置的password_resets表中虽然有email和token的映射,但是db中的token是经过hash签名的,跟发送到邮件中的token完全不一样。

file

但是broker提供了根据tokenexists方法来让你验证,你提供过来的email账号是否在进行密码验证操作。这就相当于一个user和token的绑定关系校验了。也就是验证这个token是不是这个email账号的。

/**
     * Validate the given password reset token.
     *
     * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
     * @param  string  $token
     * @return bool
     */
    public function tokenExists(CanResetPasswordContract $user, $token)
    {
        return $this->tokens->exists($user, $token);
    }

基本上这两个验证之后,就可以进行重置用户密码的操作了

2年前 评论
讨论数量: 10

生成个url 后面带上参数就ok了啊 你随便找个 平台 通过邮件修改密码 看看他是怎么做的

2年前 评论
osang (楼主) 2年前

这个不是直接写就好了吗,不需要什么别人的解决方案。我网站也有这个功能,也是 React 这种前后端分离

2年前 评论
osang (楼主) 2年前
osang (楼主) 2年前
小李世界 (作者) 2年前

第一种方法、你要跳转到前端地址,那就带上参数就行,前端自己拿到参数后就携带参数向API服务端发起请求验证

第二种方法、跳转到服务端API地址进行验证,验证完跳回前端地址

最终的验证必须是由服务端来完成的

2年前 评论
osang (楼主) 2年前
OnlyRed (作者) 2年前
OnlyRed (作者) 2年前
osang (楼主) 2年前
OnlyRed (作者) 2年前
osang (楼主) 2年前

生成一个只有修改密码权限的token

2年前 评论
Epona

确认是哪个用户是根据邮箱判断的。 可以先看一下Laravel自带的重置密码怎么处理的,然后按照对应页面进行前后端分离即可, 大部分功能还是在服务端进行处理的。

2年前 评论
osang (楼主) 2年前
流浪剑客

搞个邮箱验证码呗,为啥要执着与发链接

2年前 评论

看了两遍帖子都看不懂你的描述。我不浪费时间看下去了。都不知道你误解到哪里去了。多简单的一个功能。你自己去分析下www.showdoc.com.cn/ 的邮件链接过程。这个功能我完全不用第三方包,自己写。

2年前 评论

另外你是避免不了自己需要新建一张表来维护邮件地址跟token的对应关系的。要验证对方传送回来的token和地址是否正常。

2年前 评论
osang (楼主) 2年前
star7th (作者) 2年前

password/reset 连接带一个唯一标识符就可以了
用来匹配是哪个用户,token比较正确就给修改密码,错误就拒绝

比如
password/reset?user=xxxxx&token=xxxxxxx
user 可以是id,也可以是随机生成的字符串

2年前 评论
osang (楼主) 2年前

感谢大家的回答,最后还是使用了部分broker的验证逻辑,本来想通过broker生成的token直接能换取到重置密码的用户,但是看了broker的源码貌似没有这个能力。 用户在重置密码的时候还是必须要把email传递过来,并不是直接通过token来获取时哪个用户。

 /**
     * Get the user for the given credentials.
     *
     * @param  array  $credentials
     * @return \Illuminate\Contracts\Auth\CanResetPassword|null
     *
     * @throws \UnexpectedValueException
     */
    public function getUser(array $credentials)
    {
        $credentials = Arr::except($credentials, ['token']);

        $user = $this->users->retrieveByCredentials($credentials);

        if ($user && ! $user instanceof CanResetPasswordContract) {
            throw new UnexpectedValueException('User must implement CanResetPassword interface.');
        }

        return $user;
    }

file
broker内置的password_resets表中虽然有email和token的映射,但是db中的token是经过hash签名的,跟发送到邮件中的token完全不一样。

file

但是broker提供了根据tokenexists方法来让你验证,你提供过来的email账号是否在进行密码验证操作。这就相当于一个user和token的绑定关系校验了。也就是验证这个token是不是这个email账号的。

/**
     * Validate the given password reset token.
     *
     * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
     * @param  string  $token
     * @return bool
     */
    public function tokenExists(CanResetPasswordContract $user, $token)
    {
        return $this->tokens->exists($user, $token);
    }

基本上这两个验证之后,就可以进行重置用户密码的操作了

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!