Как получить access_token от next_auth, чтобы использовать его с googleapis,
скажем, я создаю crud-приложение, которое хранит данные на диске Google, я использую nextjs и next-auth для реализации OAuth для Google. я нашел этот блог, поэтому я его реализовал. но он регистрирует неопределенное.
src/pages/api/auth/[...nextauth].ts
import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";
import jwt from 'next-auth/jwt'
const secret = process.env.SECRET
export default NextAuth({
// Configure one or more authentication providers
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET,
authorization:{
params:{
scope:"openid https://www.googleapis.com/auth/drive.file"
}
}
}),
],
secret: process.env.SECRET,
callbacks: {
jwt: ({token, user, account, profile, isNewUser})=> {
console.info({token,user,account,profile})
if (account?.accessToken) {
token.accessToken = account.accessToken;
}
return token;
},
session: async ({session, user,token}) => {
session.user = user;
session.token = token;
return session
}
},
});
и я создал маршрут с помощью nextjs, чтобы получить токен доступа
import {getToken,decode} from 'next-auth/jwt'
const handler = async(req, res)=> {
const secret = process.env.SECRET
const token = await getToken({ req, secret });
const accessToken = token.accessToken;
console.info(accessToken)
}
export default handler
любая помощь будет здорово. спасибо
@DaImTo извините, я отредактировал вопрос, в основном я хочу знать, как получить доступ к access_token, чтобы я мог использовать его с googleapis.
Как указано в документация, вы должен пересылаете любые данные, которые вы хотите сделать доступными в токене, таково ваше значение accessToken
:
The session callback is called whenever a session is checked. By default, only a subset of the token is returned for increased security. If you want to make something available you added to the token through the jwt() callback, you have to explicitly forward it here to make it available to the client.
Итак, вам просто нужно добавить это в свой обратный вызов session
:
session.accessToken = token.accessToken;
Я пробовал, token
не содержит access_token. вместо этого токен является объектом jwt.
И вы уверены, что и account
, и accessToken
имеют значение в обратном вызове jwt
? Это единственное, что приходит мне на ум.
нет, учетная запись и access_token
не имеют значений, объект params, который мы получаем в обратном вызове, имеет только ключ token
. который не содержит access_token
вместо этого содержит sub,iat,exp,jti
нвм, я решил это. Благодарю. проблема была в том, что токен хранится в access_token
, а не в accessToken
. Спасибо за помощь
токен Google хранится в account.access_token
, а не в account.accessToken
. поэтому обратный вызов jwt должен быть
callbacks: {
jwt: ({token, account })=> {
if (account?.access_token) {
token.access_token = account.access_token;
}
return token;
},
},
и лучше не выставлять токены на стороне клиента, что я сделал в обратном вызове сеанса. это небезопасно.
Каков ваш вопрос?