如何解决Mongoose:如何使用刷新令牌“安排”访问令牌的更新在我们的数据库中?
流程:
- 用户尝试通过 Spotify (OAuth) 登录,并授予对我们网络应用 (nodejs) 的访问权限。
-
accessToken
、refreshToken
、expires_in
和profile
数据被返回以换取授权码。 (使用 Passport.js) -
accessToken
、refreshToken
和其他一些数据存储在 mongoDb Atlas(云)上,形成一个 Document。 (使用猫鼬) - 用户退出。
- 同一用户重新登录。
-
accessToken
、refreshToken
、expires_in
和profile
数据被返回以换取授权码。 - 云数据库中的文档已更新。
我们使用这些访问令牌在主应用程序 app.js
中创建 API 调用。
passport-setup.js:此文件在 app.js
中是“必需的”。
const passport = require("passport");
const SpotifyStrategy = require("passport-spotify").Strategy;
const keys = require("./keys");
const User = require("../models/user-model");
// Creating cookie
passport.serializeUser((user,done) => {
done(null,user.id);
})
// Acccessing the created cookie
passport.deserializeUser((id,done) => {
User.findById(id).then((user) => {
done(null,user);
})
})
passport.use(
new SpotifyStrategy({
// Options for Spotify Strategy
clientID: keys.spotify.clientID,clientSecret: keys.spotify.clientSecret,callbackURL: "/auth/spotify/redirect"
},(accessToken,refreshToken,expires_in,profile,done) => {
// Passport callback function
console.log("Reached Passport callback function,inside of 'passport-setup.js'.");
// Check if user already exists in our database or if there is need to create a new one.
User.findOneAndUpdate({
spotifyId: profile.id
},{
$set: {
accessToken: accessToken,refreshToken: refreshToken
}
},{
new: true,useFindAndModify: false
}).then((existingUser) => {
if (existingUser) {
console.log("User already exists in database. Latest record:");
console.log(existingUser);
done(null,existingUser);
} else {
new User({
displayName: profile.displayName,email: profile._json.email,spotifyId: profile.id,accessToken: accessToken,refreshToken: refreshToken
}).save().then((newUser) => {
console.log("New user created:");
console.log(newUser);
done(null,newUser);
}).catch((err) => {
console.log("Error occured: " + err);
})
}
})
})
)
缺点:
访问令牌在一小时后过期。要进行更多 API 调用,他需要重新登录。
应用程序需要更新:
刷新令牌应该每小时更新我们数据库中访问令牌的值。 (只有在用户保持登录状态时才会发生这种情况。)
这是我所知道的:
- 使用刷新令牌获取访问令牌:
axios({
url: "https://accounts.spotify.com/api/token",method: "post",params: {
grant_type: "refresh_token",refresh_token: // Please guide how to input the refresh token here.
},headers: {
Authorization: authorization,"Accept": "application/json","Content-Type": "application/x-www-form-urlencoded"
}
}).then(function(response) {
// console.log(response.data);
// console.log(response.data.access_token);
access_token = response.data.access_token;
token = "Bearer " + access_token;
console.log(token);
}).catch(function(error) {
console.log(error);
});
- 对于调度,我们可以使用 node-crone:
cron.schedule('*/59 * * * *',() => {
// Our task here,that we want to repeat 59th minute of every hour. We can also modify '59'. It's not necessary to have '59' only.
}
如何将以上两者放在一起?
我们需要将预定代码放在哪里 - 在 passport-setup.js
或 app.js
或其他地方?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。