前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Chrome扩展中使用Parse Platform-邮箱验证码登录

在Chrome扩展中使用Parse Platform-邮箱验证码登录

作者头像
ianzhi
发布2024-07-28 10:39:05
740
发布2024-07-28 10:39:05
举报
文章被收录于专栏:LNMP开发那些事

本来想使用oauth来实现登录,但是国内提供oauth服务要么比较小众,要么居然收费的?传统的用户注册登录使用起来过于繁琐了,很容易把用户挡在最开始的地方,最后决定添加邮箱验证码登录。

Parse Platform的文档中提到了一个Parse.User.become()方法,但是需要传递一个session token进去,翻了很多遍文档也没发现该如何获取这个session_token,最后在Github仓库的issue中搜到2023年Parse增加了一个loginAs方法,可以通过传递一个userId来将用户登陆进系统,那么通过云函数和Parse.User.become()就可以实现邮箱验证码登录了。

服务端

1. 创建发送验证码函数

代码语言:javascript
复制
const VerifyCode = Parse.Object.extend('VerifyCode')

/**
 * 发送邮件验证码
 */
Parse.Cloud.define('verifyCode', async (request) => {
    const email = request.params.email
    const code = generateRandomString(6)

    // 记录验证码
    const verifyCode = new VerifyCode()
    verifyCode.set('email', email)
    verifyCode.set('code', code)
    verifyCode.set('expiredAt', new Date(Date.now() + 1000 * 60 * 5))
    await verifyCode.save(null, { useMasterKey: true })

    // 删除过期的验证码记录
    const query = new Parse.Query(VerifyCode)
    query.lessThan('expiredAt', new Date())
    await Parse.Object.destroyAll(await query.find({ useMasterKey: true }), { useMasterKey: true })

    // 发送邮件
    await Parse.Cloud.sendEmail({
        templateName: "verifyCode",
        placeholders: { code },
        recipient: email
    });
}, {
    fields: {
        email: {
            required: true,
            type: String
        }
    },
    requireUser: false
})

2. 创建登录函数

代码语言:javascript
复制
const VerifyCode = Parse.Object.extend('VerifyCode')

Parse.Cloud.define('login', async (request) => {
    if (!request.params.email) {
        throw new Parse.Error(Parse.Error.OTHER_CAUSE, '缺少email字段');
    }
    if (!request.params.code) {
        throw new Parse.Error(Parse.Error.OTHER_CAUSE, '缺少code字段');
    }

    const query = new Parse.Query(Parse.User)
    query.equalTo('email', request.params.email)
    let user = await query.first({ useMasterKey: true })
    if (user === undefined) {
        throw new Parse.Error(Parse.Error.OTHER_CAUSE, '用户不存在');
    }

    // 验证
    const codeQuery = new Parse.Query(VerifyCode)
    codeQuery.equalTo('email', request.params.email)
    codeQuery.equalTo('code', request.params.code)
    codeQuery.greaterThan('expiredAt', new Date())
    const code = await codeQuery.first({ useMasterKey: true })
    if (code === undefined) {
        throw new Parse.Error(Parse.Error.OTHER_CAUSE, '验证码已过期');
    }

    // 修改邮箱验证字段为验证通过状态
    user.set('emailVerified', true)
    user.save(null, { useMasterKey: true })

    // 登录用户
    user = await Parse.User.loginAs(user.id)
    return user.getSessionToken()
}, {
    fields: {
        email: {
            required: true,
            type: String
        },
        code: {
            required: true,
            type: String
        }
    }
})

客户端

代码语言:javascript
复制
export async function emailLogin(email: string, code: string) {
    const token = await Parse.Cloud.run('login', { email, code })

    return await Parse.User.become(token)
}

参考

[1] 设置当前用户,JavaScript 开发人员指南 |解析 (parseplatform.org)

[2] Github PR,Add support for master key clients to create user sessions by GormanFletcher · Pull Request #7406 · parse-community/parse-server (github.com)

[3] Parse Server API Mail Adapter,parse-server-api-mail-adapter – npm (npmjs.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024年7月27日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 服务端
    • 1. 创建发送验证码函数
      • 2. 创建登录函数
      • 客户端
      • 参考
      相关产品与服务
      验证码
      腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档