八、通过Email-Provider完成授权登录

简介:

配置邮件服务器信息:

  • 推荐试用 object 形式配置,修改 .env 添加:
EMAIL_SERVER_USER=username
EMAIL_SERVER_PASSWORD=password
EMAIL_SERVER_HOST=smtp.example.com
EMAIL_SERVER_PORT=587
EMAIL_FROM=noreply@example.com

配置 provider

  • 修改 pages/api/auth/[...nextauth].js 文件,修改 EmailProvider 为:
EmailProvider({
      server: {
        host: process.env.EMAIL_SERVER_HOST,
        port: process.env.EMAIL_SERVER_PORT,
        auth: {
          user: process.env.EMAIL_SERVER_USER,
          pass: process.env.EMAIL_SERVER_PASSWORD
        }
      },
      from: process.env.EMAIL_FROM
    }),
    ...

配置 Adapter

  • 邮件登录需要数据库的支持,用来存储用户登录信息。
  • 安装相关类库依赖:yarn add next-auth @next-auth/mongodb-adapter mongodb
  • 添加文件 Add lib/mongodb.ts
// This approach is taken from https://github.com/vercel/next.js/tree/canary/examples/with-mongodb
import { MongoClient } from 'mongodb'
if (!process.env.MONGODB_URI) {
  throw new Error('Invalid/Missing environment variable: "MONGODB_URI"')
}
const uri = process.env.MONGODB_URI
const options = {}
let client
let clientPromise: Promise<MongoClient>
client = new MongoClient(uri, options)
clientPromise = client.connect()
export default clientPromise
  • 在 pages/api/auth/[...nextauth].js next-auth 添加 provider 的配置信息
...
import { MongoDBAdapter } from "@next-auth/mongodb-adapter"
import clientPromise from "../../../lib/mongodb"
...

// For more information on each option (and a full list of options) go to
// https://next-auth.js.org/configuration/options
export default NextAuth({
  adapter: MongoDBAdapter(clientPromise),
  ...
})

  • 接下来就要启动一个 mongodb 的数据服务,通过docker启动,参考 https://hub.docker.com/_/mongo 即可。(友情提示,启动时注意暴露 27017 端口的映射否则外部无法访问)
  • 配置 mongodb 的服务连接,根据你配置的用户名密码做相应的修改即可:
MONGODB_URI=mongodb://root:example@localhost:27017

测试:

  • yarn dev 可以测试效果

如果遇到问题 MissingAdapter [MissingAdapterError]: E-mail login requires an adapter.

  • 那么是因为没有配置数据库服务,可以参考Adapter列表。

如何高度自定义

  • 有没有一种情况,你觉得默认的 nodemailer 不好用,或者希望通过短信,微信或者其他什么的来扩展链接登录(本质上Email就是连接登录)
  • 从源码上 /node_modules/next-auth/providers/index.d.ts 可以看到
export declare type Provider = OAuthConfig<any> | EmailConfig | CredentialsConfig;
  • 那么 EmailConfig 的定义是什么呢?
export interface EmailConfig extends CommonProviderOptions {
    type: "email";
    server: string | SMTPTransportOptions;
    from?: string;
    maxAge?: number;
    sendVerificationRequest: (params: SendVerificationRequestParams) => Awaitable<void>;
    generateVerificationToken?: () => Awaitable<string>;
    secret?: string;
    normalizeIdentifier?: (identifier: string) => string;
    options: EmailUserConfig;
}
  • 根据上面的定义,就可以知道如果要重新完全可以在 [...nextauth].ts 这个文件重新定义 generateVerificationToken 的回调来完成高度自治:
    image.png
  • 大致就是这个样子的一个结构:


    image.png

结束

  • 接下来介绍 Client API
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容