首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当尝试使用next-connect将http://localhost:3000重定向到Next.js中的https://api.twitter.com时出现CORS错误?

当尝试使用next-connect将http://localhost:3000重定向到Next.js中的https://api.twitter.com时出现CORS错误?
EN

Stack Overflow用户
提问于 2021-11-25 05:30:08
回答 1查看 842关注 0票数 1

我试图让redirect开始工作,但是总是在控制台中被一个错误所轰炸,上面写着:

访问“https://api.twitter.com/oauth/authenticate?oauth_token=”(从“http://localhost:3000/api/auth/twitter/generate-auth-link'”重定向)从源“http://localhost:3000”获取的访问已被CORS策略阻止:请求的资源上不存在“访问控制-允许-原产地”标题。如果不透明响应满足您的需要,请将请求的模式设置为“no- CORS”,以获取禁用CORS的资源。

我确实在同一个问题上看到了其他答案&事实上,我在两个月前刚刚发现我问过the same question,但这个问题适用于打开一个弹出窗口&这个问题需要在同一个页面上重定向。

我也尝试过同样的答案,但它不起作用&它仍然给我cors错误的这个代码:

代码语言:javascript
复制
.use((req, res, next) => {
    console.log('cors')
    res.setHeader('Access-Control-Allow-Origin', '*')
    res.setHeader(
        'Access-Control-Allow-Headers',
        'Origin, X-Requested-With, Content-Type, Accept, Authorization'
    )
    if (req.method == 'OPTIONS') {
        res.setHeader('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET')
        return res.status(200).json({})
    }
    next()
})

我还尝试使用以下代码:

代码语言:javascript
复制
const allowedOrigins = ['http://localhost:3000']

const options: cors.CorsOptions = {
    allowedHeaders: [],
    origin: allowedOrigins,
}

.use(cors(options))

但这也行不通。

我的oauth流是这样的:

单击http://localhost:3000→登录到https://api.twitter.com/oauth/authenticate?oauth_token=xxxx→重定向回http://localhost:3000

相同oauth流的代码如下所示:

api/auth/twitter/generate link.ts.api

代码语言:javascript
复制
import { NextApiResponse } from 'next'
import TwitterApi from 'twitter-api-v2'

import handler from '@/server/api-route'
import { SERVER_URL, TWITTER_CONFIG } from '@/utils/index'
import { NextIronRequest } from '@/types/index'

const generateAuthLink = async (req: NextIronRequest, res: NextApiResponse) => {
    // Generate an authentication URL
    const { url, oauth_token, oauth_token_secret } = await new TwitterApi({
        appKey: TWITTER_CONFIG.consumerKey,
        appSecret: TWITTER_CONFIG.consumerSecret,
    }).generateAuthLink(`${SERVER_URL}/api/auth/twitter/get-verifier-token`)

    req.session.twitter = {
        oauth_token,
        oauth_token_secret,
    }

    await req.session.save()

    // redirect to the authentication URL
    res.redirect(url)
}

export default handler().get(generateAuthLink)

api/auth/twitter/get-验证器-记号

代码语言:javascript
复制
import { NextApiResponse } from 'next'
import TwitterApi from 'twitter-api-v2'

import handler from '@/server/api-route'
import { SERVER_URL, TWITTER_CONFIG } from '@/utils/index'
import { NextIronRequest } from '@/types/index'

const getVerifierToken = async (req: NextIronRequest, res: NextApiResponse) => {
    // check query params and session data
    const { oauth_token, oauth_verifier } = req.query

    if (typeof oauth_token !== 'string' || typeof oauth_verifier !== 'string') {
        res.status(401).send('Oops, it looks like you refused to log in..')
        return
    }

    if (!req.session.twitter)
        throw new Error("Can't find `oauth_token` & `oauth_token_secret` in `req.session.twitter`")

    const oauth_token_secret = req.session.twitter.oauth_token_secret

    if (typeof oauth_token_secret !== 'string') {
        res.status(401).send('Oops, it looks like your session has expired.. Try again!')
        return
    }

    // fetch the token / secret / account infos (from the temporary one)
    const { client, accessToken, accessSecret } = await new TwitterApi({
        appKey: TWITTER_CONFIG.consumerKey,
        appSecret: TWITTER_CONFIG.consumerSecret,
        accessToken: oauth_token,
        accessSecret: oauth_token_secret,
    }).login(oauth_verifier)

    const { name, screen_name, email } = await client.currentUser()

    req.session.twitter = { oauth_token: accessToken, oauth_token_secret: accessSecret }
    req.session.user = { name, screen_name, email }
    await req.session.save()

    res.redirect('/app')
}

export default handler().get(getVerifierToken)

如何解决cors问题,以便正确地重定向工作?

当我使用next-auth时,它起了作用,但无法从代码中找出它发生的位置。但我要的是完全相同的流量。点击Login &它被重定向到Twitter &当它被认证后,被重定向回localhost

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-25 06:31:46

As mentioned here,Twitter不支持CORS。

因此,我不能只在res.redirect(url)中使用api/auth/twitter/generate-auth-link.ts,而是使用res.send({ url })返回url &在前面我做了以下操作:

代码语言:javascript
复制
import ky from 'ky'

const res: { url: string } = await ky.get('/api/auth/twitter/generate-auth-link').json()
window.location.href = res.url

而且起作用了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70106199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档