Update authentication redirects to use environment variable for site URL, enhancing flexibility for different environments. Add NEXT_PUBLIC_SITE_URL to .env for production URL configuration.
This commit is contained in:
4
.env
4
.env
@@ -24,4 +24,6 @@ NEXT_PUBLIC_SUPABASE_URL="https://mwwvqwevplndzvmqmrxa.supabase.co"
|
|||||||
NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im13d3Zxd2V2cGxuZHp2bXFtcnhhIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDQzNDU2NDMsImV4cCI6MjA1OTkyMTY0M30.EI7OY0Aq3zYj6fRG_IUn4IlUZ89b0LOg0jb0nMLLKWU"
|
NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im13d3Zxd2V2cGxuZHp2bXFtcnhhIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDQzNDU2NDMsImV4cCI6MjA1OTkyMTY0M30.EI7OY0Aq3zYj6fRG_IUn4IlUZ89b0LOg0jb0nMLLKWU"
|
||||||
DATABASE_URL="postgresql://postgres.mwwvqwevplndzvmqmrxa:eYYdarJsRL*Z6&p9gD@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres"
|
DATABASE_URL="postgresql://postgres.mwwvqwevplndzvmqmrxa:eYYdarJsRL*Z6&p9gD@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres"
|
||||||
|
|
||||||
NEXT_PUBLIC_LIMQ_API="https://app.upj.to"
|
NEXT_PUBLIC_LIMQ_API="https://app.upj.to"
|
||||||
|
# Application URL for redirects (replace with your production URL)
|
||||||
|
NEXT_PUBLIC_SITE_URL="https://main.upj.to/login"
|
||||||
29
.env.development
Normal file
29
.env.development
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
PORT=3007
|
||||||
|
|
||||||
|
# ClickHouse Configuration
|
||||||
|
CLICKHOUSE_HOST=10.0.1.60
|
||||||
|
CLICKHOUSE_PORT=8123
|
||||||
|
CLICKHOUSE_USER=admin
|
||||||
|
CLICKHOUSE_PASSWORD=your_secure_password
|
||||||
|
CLICKHOUSE_DATABASE=shorturl_analytics
|
||||||
|
CLICKHOUSE_URL=http://10.0.1.60:8123
|
||||||
|
|
||||||
|
REDIS_HOST="localhost"
|
||||||
|
REDIS_PORT="6379"
|
||||||
|
REDIS_PASSWORD=""
|
||||||
|
|
||||||
|
# Supabase Configuration
|
||||||
|
SUPABASE_URL="https://mwwvqwevplndzvmqmrxa.supabase.co"
|
||||||
|
SUPABASE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im13d3Zxd2V2cGxuZHp2bXFtcnhhIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc0NDM0NTY0MywiZXhwIjoyMDU5OTIxNjQzfQ.ZenTsEAdGiDu1DCCOT7G8xxvgFXKLl4qhHB-AhSVf6w"
|
||||||
|
SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im13d3Zxd2V2cGxuZHp2bXFtcnhhIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDQzNDU2NDMsImV4cCI6MjA1OTkyMTY0M30.EI7OY0Aq3zYj6fRG_IUn4IlUZ89b0LOg0jb0nMLLKWU"
|
||||||
|
DATABASE_URL="postgresql://postgres.mwwvqwevplndzvmqmrxa:eYYdarJsRL*Z6&p9gD@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres"
|
||||||
|
|
||||||
|
|
||||||
|
# Next.js Public Environment Variables (accessible in browser)
|
||||||
|
NEXT_PUBLIC_SUPABASE_URL="https://mwwvqwevplndzvmqmrxa.supabase.co"
|
||||||
|
NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im13d3Zxd2V2cGxuZHp2bXFtcnhhIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDQzNDU2NDMsImV4cCI6MjA1OTkyMTY0M30.EI7OY0Aq3zYj6fRG_IUn4IlUZ89b0LOg0jb0nMLLKWU"
|
||||||
|
DATABASE_URL="postgresql://postgres.mwwvqwevplndzvmqmrxa:eYYdarJsRL*Z6&p9gD@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres"
|
||||||
|
|
||||||
|
NEXT_PUBLIC_LIMQ_API="https://app.upj.to"
|
||||||
|
# Application URL for redirects (replace with your production URL)
|
||||||
|
NEXT_PUBLIC_SITE_URL="https://main.upj.to/login"
|
||||||
29
.env.production
Normal file
29
.env.production
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
PORT=3007
|
||||||
|
|
||||||
|
# ClickHouse Configuration
|
||||||
|
CLICKHOUSE_HOST=10.0.1.60
|
||||||
|
CLICKHOUSE_PORT=8123
|
||||||
|
CLICKHOUSE_USER=admin
|
||||||
|
CLICKHOUSE_PASSWORD=your_secure_password
|
||||||
|
CLICKHOUSE_DATABASE=shorturl_analytics
|
||||||
|
CLICKHOUSE_URL=http://10.0.1.60:8123
|
||||||
|
|
||||||
|
REDIS_HOST="localhost"
|
||||||
|
REDIS_PORT="6379"
|
||||||
|
REDIS_PASSWORD=""
|
||||||
|
|
||||||
|
# Supabase Configuration
|
||||||
|
SUPABASE_URL="https://mwwvqwevplndzvmqmrxa.supabase.co"
|
||||||
|
SUPABASE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im13d3Zxd2V2cGxuZHp2bXFtcnhhIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc0NDM0NTY0MywiZXhwIjoyMDU5OTIxNjQzfQ.ZenTsEAdGiDu1DCCOT7G8xxvgFXKLl4qhHB-AhSVf6w"
|
||||||
|
SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im13d3Zxd2V2cGxuZHp2bXFtcnhhIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDQzNDU2NDMsImV4cCI6MjA1OTkyMTY0M30.EI7OY0Aq3zYj6fRG_IUn4IlUZ89b0LOg0jb0nMLLKWU"
|
||||||
|
DATABASE_URL="postgresql://postgres.mwwvqwevplndzvmqmrxa:eYYdarJsRL*Z6&p9gD@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres"
|
||||||
|
|
||||||
|
|
||||||
|
# Next.js Public Environment Variables (accessible in browser)
|
||||||
|
NEXT_PUBLIC_SUPABASE_URL="https://mwwvqwevplndzvmqmrxa.supabase.co"
|
||||||
|
NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im13d3Zxd2V2cGxuZHp2bXFtcnhhIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDQzNDU2NDMsImV4cCI6MjA1OTkyMTY0M30.EI7OY0Aq3zYj6fRG_IUn4IlUZ89b0LOg0jb0nMLLKWU"
|
||||||
|
DATABASE_URL="postgresql://postgres.mwwvqwevplndzvmqmrxa:eYYdarJsRL*Z6&p9gD@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres"
|
||||||
|
|
||||||
|
NEXT_PUBLIC_LIMQ_API="https://app.upj.to"
|
||||||
|
# Application URL for redirects (replace with your production URL)
|
||||||
|
NEXT_PUBLIC_SITE_URL="https://main.upj.to/login"
|
||||||
42
README-auth-setup.md
Normal file
42
README-auth-setup.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# 身份验证重定向 URL 配置指南
|
||||||
|
|
||||||
|
## 问题:注册后确认邮件链接指向 localhost
|
||||||
|
|
||||||
|
如果您在生产环境中使用此应用,并且发现用户注册后收到的确认邮件中的链接指向 `localhost` 而非您的实际网站域名,请按照以下步骤解决:
|
||||||
|
|
||||||
|
## 解决方案
|
||||||
|
|
||||||
|
### 1. 设置环境变量
|
||||||
|
|
||||||
|
在项目根目录的 `.env.production` 文件中,确保 `NEXT_PUBLIC_SITE_URL` 变量设置为您的实际生产域名:
|
||||||
|
|
||||||
|
```
|
||||||
|
NEXT_PUBLIC_SITE_URL="https://您的真实域名.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 在 Supabase 控制台中配置
|
||||||
|
|
||||||
|
登录 [Supabase 控制台](https://app.supabase.com/),然后:
|
||||||
|
|
||||||
|
1. 选择您的项目
|
||||||
|
2. 导航到 **Authentication** > **URL Configuration**
|
||||||
|
3. 在 **Site URL** 字段中输入您的实际网站 URL
|
||||||
|
4. 在 **Redirect URLs** 部分添加:
|
||||||
|
- `https://您的真实域名.com/auth/callback`
|
||||||
|
|
||||||
|
### 3. 本地开发与生产环境
|
||||||
|
|
||||||
|
- **开发环境**:使用 `.env.development` 文件中的设置,通常为 `http://localhost:3007`
|
||||||
|
- **生产环境**:使用 `.env.production` 文件中的设置,应为您的实际域名
|
||||||
|
|
||||||
|
### 4. 部署后验证
|
||||||
|
|
||||||
|
项目重新部署后:
|
||||||
|
1. 尝试注册一个新账户
|
||||||
|
2. 检查收到的确认邮件,确认链接现在指向您的实际域名而非 localhost
|
||||||
|
|
||||||
|
## 技术说明
|
||||||
|
|
||||||
|
身份验证流程中,应用使用环境变量 `NEXT_PUBLIC_SITE_URL` 构建重定向 URL。如果未设置此变量,它会回退到使用 `window.location.origin`,这在本地开发时会是 `localhost`。
|
||||||
|
|
||||||
|
通过正确设置此变量,您可以确保无论在何处运行应用,邮件中的链接都能正确指向应用的实际位置。
|
||||||
15
lib/auth.tsx
15
lib/auth.tsx
@@ -101,11 +101,14 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
|
|||||||
const signInWithGoogle = async () => {
|
const signInWithGoogle = async () => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
|
// 获取网站 URL,如果环境变量不存在则使用当前来源
|
||||||
|
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || window.location.origin;
|
||||||
|
|
||||||
// 尝试通过Supabase登录Google
|
// 尝试通过Supabase登录Google
|
||||||
const { error } = await supabase.auth.signInWithOAuth({
|
const { error } = await supabase.auth.signInWithOAuth({
|
||||||
provider: 'google',
|
provider: 'google',
|
||||||
options: {
|
options: {
|
||||||
redirectTo: `${window.location.origin}/auth/callback`,
|
redirectTo: `${siteUrl}/auth/callback`,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -127,11 +130,14 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
|
|||||||
const signInWithGitHub = async () => {
|
const signInWithGitHub = async () => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
|
// 获取网站 URL,如果环境变量不存在则使用当前来源
|
||||||
|
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || window.location.origin;
|
||||||
|
|
||||||
// 尝试通过Supabase登录GitHub
|
// 尝试通过Supabase登录GitHub
|
||||||
const { error } = await supabase.auth.signInWithOAuth({
|
const { error } = await supabase.auth.signInWithOAuth({
|
||||||
provider: 'github',
|
provider: 'github',
|
||||||
options: {
|
options: {
|
||||||
redirectTo: `${window.location.origin}/auth/callback`,
|
redirectTo: `${siteUrl}/auth/callback`,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -153,12 +159,15 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
|
|||||||
const signUp = async (email: string, password: string) => {
|
const signUp = async (email: string, password: string) => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
|
// 获取网站 URL,如果环境变量不存在则使用当前来源
|
||||||
|
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || window.location.origin;
|
||||||
|
|
||||||
// 尝试通过Supabase注册
|
// 尝试通过Supabase注册
|
||||||
const { error } = await supabase.auth.signUp({
|
const { error } = await supabase.auth.signUp({
|
||||||
email,
|
email,
|
||||||
password,
|
password,
|
||||||
options: {
|
options: {
|
||||||
emailRedirectTo: `${window.location.origin}/auth/callback`,
|
emailRedirectTo: `${siteUrl}/auth/callback`,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user