我通过 SignalR 从客户端(角度 9)和服务器(asp.net core 3.1)创建实时连接,并通过 JWT 令牌授权集线器,如下代码:
private createConnection() {
this.hubConnection = new HubConnectionBuilder().withUrl(`${this.appConfig.hubEndpoint}/Hubs`,
{ accessTokenFactory: () => jwtToken })
.withAutomaticReconnect()
.build();
}
private startConnection(): void {
this.hubConnection
.start()
.then(() => {
this.connectionIsEstablished = true;
this.connectionEstablished.emit(true);
})
.catch(err => {
console.log('Error while establishing connection, retrying...');
});
}
Run Code Online (Sandbox Code Playgroud)
在令牌过期之前,这一切正常。根据我的研究,在收到带有刷新令牌的新令牌后,应停止先前的连接,并使用新令牌创建新连接。现在我想知道我该怎么做?我必须经常检查令牌吗?或者应该通过向服务器发送每个请求来解决这个问题?
我正在绞尽脑汁地思考如何从中获取刷新令牌,FirebaseAuth但似乎找不到如何获取刷新令牌。
在 iOS 上,相当于Auth.auth().currentUser?.refreshToken. 非常感谢任何帮助。
我正在使用 Google Ads php 库 ( https://github.com/googleads/googleads-php-lib ) 来管理我自己的Google 广告帐户,按照 Google 的说明进行操作 ( https://developers.google.com/adwords/ api/docs/guides/first-api-call)
(实际上我已经这样做很多年了,没有出现任何问题,但我最近转而使用 Google Cloud Platform 中的另一个项目,因此我必须更新我的凭据并获取新的刷新令牌)
为了获得新的刷新令牌,我运行了名为的 php 脚本GetRefreshTokenWithoutIniFile.php(它允许我授予离线访问权限并检索新的刷新令牌,我将其存储在文件中auth.ini以供将来使用)。
在我看到此错误之前,刷新令牌会持续几天:
{
"error" : "invalid_grant",
"error_description" : "Token has been expired or revoked."
}
Run Code Online (Sandbox Code Playgroud)
我多年来一直使用上述方法,并且刷新令牌从未过期。然而,现在它似乎每隔几天就会过期。我当然没有“用完”刷新令牌(我只请求一个),并且用户没有撤销访问权限(用户是我)。因此,这些类似的答案对我没有帮助:
“令牌已过期或撤销” - Google OAuth2 刷新令牌在几天内过期 表明“安全活动”存在问题,但我在我的 Google 帐户中没有看到任何安全问题。
Google 令牌刷新返回“令牌已过期或撤销”。由于几天后刷新令牌已自动过期,表明问题可能是刷新令牌太多 - 但是,我只检索令牌一次并重新使用相同的令牌(直到它过期!)
根据令牌已过期或撤销 - Google Ads,除非应用程序处于“生产”模式,否则刷新令牌不会持续存在。但是,我尝试了该解决方案,但它不起作用:令牌在几天后仍然过期。
还有更多想法吗?
如果我正确理解了刷新令牌轮换,这意味着每次我们请求新的访问令牌时,我们也会获得一个新的刷新令牌。如果多次使用刷新令牌 - 我们会使某个用户之前使用的所有刷新令牌失效,并且用户必须再次执行身份验证过程。
这是否意味着我们需要将所有刷新令牌(所有旧的)存储在数据库中?
难道我们不能简单地存储最后一个刷新令牌(尚未使用),并且对于每个获取新访问令牌的请求,我们将检查请求中发送的刷新令牌是否在数据库中,如果那么,我们将创建一个新的访问和刷新令牌并覆盖数据库中的旧刷新令牌,以便旧的刷新令牌不能用于获取新令牌?
这样的刷新令牌应该存在多久?
我在博客(此处)中看到有关使用 JWT 在 React 中进行身份验证的内容,此设置:访问令牌到期时间为 15 分钟,刷新令牌到期时间为 1 个月;每 10 分钟客户端调用/refreshToken端点一次,检查刷新令牌是否仍然有效(否则用户将看到登录屏幕)。
在服务器上,/refreshToken端点正确检查刷新令牌是否未过期,刷新令牌有效负载中具有 ID 的用户仍然存在且有效(即:传递的刷新令牌存在于其刷新令牌数组中)。如果一切正常,则会生成一个新的访问令牌,并与响应一起发回。
到目前为止,一切都很好。但是,在返回响应之前,也会生成一个新的刷新令牌,并将旧的刷新令牌替换到用户的刷新令牌数组中...我认为这种策略是有缺陷的,因为这样用户就永远不会看到他的登录过期,即使在之后刷新令牌(本例中为一个月)将过期...
我确实做了一些测试(将 1 个月值降低到 30 分钟),并且实际上用户授权永远不会过期...强制注销用户删除其刷新令牌数组显然效果很好,但我希望刷新时会注销令牌按年龄过期。
我询问我的理解是否正确(服务器上的refreshToken端点不应刷新刷新令牌,而应仅刷新访问令牌),或者我是否错过了某些内容。
@Ghero 评论后更新:我明白你的观点...但是如果不更新令牌的过期时间,为什么要刷新令牌呢?
然而,博客的代码用于更新刷新令牌:
const jwt = require("jsonwebtoken");
exports.getRefreshToken = (user) => {
const refreshToken = jwt.sign(user, process.env.REFRESH_TOKEN_SECRET, {
expiresIn: eval(process.env.REFRESH_TOKEN_EXPIRY),
});
return refreshToken;
};
// REFRESH_TOKEN_EXPIRY is set to 30 days
Run Code Online (Sandbox Code Playgroud)
看起来总是把到期日期推迟到未来30天。这样就永远不会过期了...
email我有一组纯粹用于我自己的应用程序的 API,因此当用户提供和时,我只有一个简单的 API 来创建访问令牌password
/api/access_tokenaccess_token(当email和匹配时返回password)
已access_token保存并与数据库sessions表中的expiry字段进行匹配,目前有效期为one week,因此用户需要在一周后重新登录。
到目前为止,它运行良好,但如果我想要拥有remember meFacebook / Twitter 应用程序的功能,这意味着用户不需要经常重新登录,我认为他们正在使用类似的方法OAuth refresh access tokens。
由于我没有使用这些 OAuth 东西,鉴于我当前的设计和设置,实现相同功能的最简单且安全的方法是什么?
我试图访问授权服务器,当用户提供用户名和密码时,该服务器会发出短期访问令牌和更长时间的刷新令牌.
我是IdentityServer4的新手。我读到我需要实现一个IPersistedGrantStore将刷新令牌存储到PersistedGrants数据库中的表中。
当本机应用程序请求新的访问令牌时,IdentityServer日志如下:"refresh_token" grant with value: "{value}" not found in store。
那是因为我正在使用持久授权存储的内存版本。因此,我需要在PersistedGrant表中存储刷新令牌。
因此,在我的startup.cs中,添加了以下行:
builder.Services.AddScoped<IPersistedGrantStore, PersistedGrantStore>();
Run Code Online (Sandbox Code Playgroud)
和IPersistedGrantStore.cs是
public interface IPersistedGrantStore
{
Task StoreAsync(CustomPersistedGrant grant);
Task<CustomPersistedGrant> GetAsync(string key);
Task<IEnumerable<CustomPersistedGrant>> GetAllAsync(string subjectId);
}
Run Code Online (Sandbox Code Playgroud)
所以我有一个CustomPersistedGrant.cs类
public class CustomPersistedGrant
{
public string Key { get; set; }
public string Type { get; set; }
public string SubjectId { get; set; }
public string ClientId { get; set; }
public DateTime CreationTime { …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现401响应的catch,并尝试在令牌刷新后基于Angular 4 Interceptor重试请求获取刷新令牌 .我试图实现同样的事情,但我从来没有能够重试该请求,我真的不确定这是否是应用刷新令牌策略的最佳方法.这是我的代码:
@Injectable()
export class AuthInterceptorService implements HttpInterceptor {
public authService;
refreshTokenInProgress = false;
tokenRefreshedSource = new Subject();
tokenRefreshed$ = this.tokenRefreshedSource.asObservable();
constructor(private router: Router, private injector: Injector) { }
authenticateRequest(req: HttpRequest<any>) {
const token = this.authService.getToken();
if (token != null) {
return req.clone({
headers: req.headers.set('Authorization', `Bearer ${token.access_token}`)
});
}
else {
return null;
}
}
refreshToken() {
if (this.refreshTokenInProgress) {
return new Observable(observer => {
this.tokenRefreshed$.subscribe(() => {
observer.next();
observer.complete();
});
});
} else …Run Code Online (Sandbox Code Playgroud) 我正在使用来自节点的googleapis程序包来获取刷新令牌,并从前端传递的身份验证代码访问令牌,但是每次遇到以下错误时,我都会这样做。
{
error: 'redirect_uri_mismatch',
error_description: 'Bad Request'
}
Run Code Online (Sandbox Code Playgroud)
我知道当我们与控制台中作为回调URL传递的URL不匹配时,会出现此错误。 https://console.cloud.google.com/apis/credentials
但我已经在控制台中设置了正确的URL。仍然不确定代码有什么问题。
使用/auth从传递令牌front-end来node-server。
const {
google
} = require("googleapis");
const OAuth2 = google.auth.OAuth2;
var bodyParser = require('body-parser')
const express = require('express');
const app = express();
app.use(bodyParser.json());
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
app.use('/tokenCallback', (req, res) => {
console.log(req);
res.send('An alligator approaches!');
});
app.post('/auth', (req, res) => {
runProcess(req.body.auth);
res.send('An alligator approaches!');
});
app.listen(4300);
function runProcess(code) {
const …Run Code Online (Sandbox Code Playgroud) oauth google-authentication node.js google-apis-explorer refresh-token
refresh-token ×10
jwt ×5
access-token ×3
node.js ×2
oauth ×2
android ×1
angular ×1
angular5 ×1
asp.net-core ×1
google-api ×1
interceptor ×1
javascript ×1
kotlin ×1
oauth-2.0 ×1
persistence ×1
reactjs ×1
security ×1
signalr ×1