我使用 IHttpClientFactory 发送请求并接收从我的 Web API 到使用 Net Core 2.2 的外部 API 的 HTTP 响应。
用于向 API 发送请求的访问令牌和刷新令牌已存储在 appsettings.json 中。当请求返回 403 或 401 错误时,我会动态获取一个新令牌并将其添加到请求的标头中。
但是如何使用新的访问和刷新令牌更新 appsettings.json 以便将其用于后续请求。
是否有比 appsettings.json 更好的方法来存储访问和刷新令牌?
我有一个移动应用程序,它通过后端实现 JWT 身份验证。访问令牌的生命周期很短(1 小时),并且不会存储在后端。现在是刷新令牌:
如果刷新令牌过期,则意味着用户将定期注销,从业务角度来看,这是非常不希望的,它可能会损害用户保留率。有没有办法在不削弱安全性的情况下避免这种情况,例如使刷新令牌“永恒”?
存储和清理刷新令牌表以防止未使用令牌累积的最佳方法是什么?假设我有以下表结构:user_id, device_id, refresh_token。如果策略是刷新令牌永不过期,则使它们失效的唯一方法是当用户注销时。但是,用户也可以删除应用程序、丢失或损坏设备,或者device_id出于任何原因进行更改。我能想到的一种解决方案是设置一个refreshed_at时间戳,允许在几个月不使用后使令牌失效。还有其他已知的技巧吗?
假设我在刷新访问令牌时除了刷新令牌之外还使用共享秘密字符串,我的理解是否正确:如果所有 3 个令牌(访问令牌、刷新令牌和共享秘密)都被泄露,我对此无能为力?API 调用的最佳实践是什么refresh?
我的问题是确定何时刷新访问令牌。
我读过,我应该在每次请求之前刷新新的访问令牌,但它在其他地方说不建议这样做。所以我的问题是我是否应该在每次请求之前刷新访问令牌,或者发送请求并在收到 401 未经授权状态后刷新访问令牌并重试对指定资源的请求。
我现在在处理从 Google Identity Services 收到的访问令牌时遇到了麻烦。
有关此案的一些细节。我有全栈应用程序,后端基于Spring/Webflux/Hibernate-Reactive,前端基于React。我正在使用 Google Identity Services 的 google 登录功能以及此反应库@react-oauth/google。
我正在使用成功登录后收到的“凭据”进行后端访问。一切都按预期工作,只是成功登录后响应中没有刷新令牌。令牌在 1 小时后过期,必须提示用户重新登录才能收到新令牌,这太可怕了!
那么,如何刷新这个令牌,有什么想法吗?
我在谷歌方面找不到更多信息,这就是我在这里写下的原因。
我目前正在研究Podio集成,我偶然发现了一些文章,这些文章没有给出明确的答案,刷新资本是否会自动失效,在这种情况下获取新刷新令牌的确切流程是什么.
文章:
Podio刷新令牌到期 - 它不会过期(从用户名中有Podio的人回答,最近)
https://help.podio.com/hc/en-us/community/posts/206669587-Get-new-refresh-token - 它过期了,你把它作为响应的一部分而不是rly?有一些讨论没有结论
我问这个是因为我使用了很多服务和OAuth实现,但它是第一次刷新令牌实际上变得无效.那么如果28天过去了那么用户必须重新认证?或者只是令牌无效但"授权"仍然存在?我不得不说它很混乱,因为我习惯于接近grant ==刷新令牌,但我理解它与OAuth规范有关.另外我们只想在db中存储刷新令牌.我很想测试它,但我不想等待28天.
文档没有明确说明刷新令牌的生命周期是什么.
我喜欢Podio的某个人给出明确的答案.刷新令牌是否过期,只有在完全不活动(没有api调用)或只是固定数量时,以及在什么情况下(不活动或时间过去),获取刷新令牌的确切流程是什么,它是否需要用户重新认证?
我在 .Net Core 2.0 中使用 IdentityServer4 并且我成功生成了访问令牌和刷新令牌。我只需要能够在生成时在服务器端“看到”刷新令牌,以便我可以将其保存在数据库中以用于某些特定目的。
在服务器上生成刷新令牌时,如何访问它的值?
我在代理中使用Nuxt-axios模块。
对于错误处理,我在
插件/axios.js
export default function({ $axios, __isRetryRequest, store, app, redirect , payload , next}) {
$axios.onRequest(config => {
if (app.$cookies.get('at') && app.$cookies.get('rt') && config.url != '/post_login/') {
config.headers.common['Authorization'] = `Bearer ${app.$cookies.get('at')}`;
}
});
$axios.onResponseError(err => {
const code = parseInt(err.response && err.response.status)
let originalRequest = err.config;
if (code === 401) {
originalRequest.__isRetryRequest = true;
store
.dispatch('LOGIN', { grant_type: 'refresh_token', refresh_token: app.$cookies.get('rt')})
.then(res => {
originalRequest.headers['Authorization'] = 'Bearer ' + app.$cookies.get('at');
return app.$axios(originalRequest);
})
.catch(error => {
console.log(error); …Run Code Online (Sandbox Code Playgroud) 我开发的应用程序iOS,并android在我正在整合ZOHO CRM。我使用 OAuth2.0 进行身份验证,之后我使用 REST API 来获取“刷新令牌”,但我只得到“访问令牌”。有下面的代码来获取令牌。我怎样才能获得刷新令牌?
self.getCodeFromCRM(client_id: Client_ID,
clientSecret: secID,
authURL: "https://accounts.zoho.in/oauth/v2/auth",
accessURL: "offline",
responseType: "code",
callBackURL: "zohoapp://",
scope: "ZohoCRM.modules.contacts.all",//ZohoCRM.users.ALL
state: "code")
Run Code Online (Sandbox Code Playgroud)
获取调用此 API 的代码以获取刷新和访问令牌后。
func getZohoReferenceToken()
{
let headers = [
"Content-Type": "application/x-www-form-urlencoded",
"User-Agent": "PostmanRuntime/7.13.0",
"Accept": "*/*",
"Cache-Control": "no-cache",
"Postman-Token": "88ebde59-240a-4e52-8ff9-bb7384eba0dd,9a1d5ea1-a5c0-490e-b3b5-1884e335ef86",
"Host": "accounts.zoho.in",
"accept-encoding": "gzip, deflate",
"content-length": "254",
"Connection": "keep-alive",
"cache-control": "no-cache"
]
let postData = NSMutableData(data: "client_id=\(Client_ID)".data(using: String.Encoding.utf8)!)
postData.append("&client_secret=\(secID)".data(using: String.Encoding.utf8)!)
postData.append("&redirect_uri=zohoapp://".data(using: String.Encoding.utf8)!)
postData.append("&code=\(code)".data(using: String.Encoding.utf8)!)
postData.append("&grant_type=authorization_code".data(using: String.Encoding.utf8)!)
postData.append("&prompt=consent".data(using: String.Encoding.utf8)!)
let request = …Run Code Online (Sandbox Code Playgroud) 我有两场战争:app.war(struts web 应用程序)和rest.war(经典的rest api)。
app.war通过 jwt 令牌进行访问rest.war,该令牌在用户登录成功后生成app.war。
当用户使用时,需要通过使用jwt token从jsp发送ajax调用来a.war获取一些数据。rest.wara.war
jwt令牌的过期时间是15分钟,而会话超时时间app.war是1小时。
但是,如果 jwt 令牌过期,即使弹出要求用户重新登录,用户仍然可以访问app.war。
有一种选择:使用access_token和refresh_token,如果access_token过期,则使用refresh_token获取新的access_token和refresh_token。
对于这种方法,我有一些疑问:
首先,为什么使用两个令牌?因为我认为它们是相同的,只是refresh_token寿命比 access_token并使用refresh_token新的更长access_token,所以为什么不只是access_token将其过期时间设置得更长呢?
其次access_token,生成和的算法是否相同refresh_token,只是它们的过期时间不同?
第三,如果客户端使用令牌执行多个 api 调用(同步和异步),如果其中一个调用返回 401(令牌过期),如何处理?
我使用我的React Spa应用程序进行令牌身份验证。在执行CRUD程序之前,我要检查刷新令牌的到期时间。如果刷新令牌有效,则没问题,但如果无效,我将发送旧的刷新令牌,并在发送原始数据之前从服务器接收新的刷新和访问令牌。到此为止没有问题。
问题在于刷新机制完成了,而没有等待服务器的响应。
currentUser存储令牌值。我检查null控制以获取令牌,然后如果到期时间无效,则发送旧的刷新令牌。
此时,该函数将返回,而无需等待authenticationService.createAccessTokenByRefreshToken函数的响应。函数必须等待此函数,因为如果访问令牌无效,则需要新的令牌。
为什么函数不等待就结束?
export function authHeader() {
var authorization = {
Authorization: ''
};
var currentUser = authenticationService.currentUserValue;
if (currentUser && currentUser.token) {
const refreshToken = currentUser.refreshToken;
const expiration = currentUser.expiration;
var moment = require('moment');
var now = moment();
if (moment(now).isAfter(expiration)) {
authenticationService.createAccessTokenByRefreshToken(refreshToken).then((res) => {
authorization.Authorization = `Bearer ${res.data.token}`;
return Promise.resolve(authorization);
});
}
else {
authorization.Authorization = `Bearer ${currentUser.token}`;
return Promise.resolve(authorization);
}
//return { Authorization: `Bearer ${currentUser.token}` };
} else {
return Promise.reject(authorization);
}
}
Run Code Online (Sandbox Code Playgroud) 这个问题很简单:
我的代码:
return urlSession.dataTaskPublisher(for: urlRequest)
.tryMap { (data: Data, response: URLResponse) -> Data in
//TODO: hide loader
GRP.hideLoader()
if let httpURLResponse = response as? HTTPURLResponse {
if !(200...299 ~= httpURLResponse.statusCode) {
var error = NetworkingError(errorCode: httpURLResponse.statusCode)
if let json = try? JSONSerialization.jsonObject(with: data, options: []) {
error.jsonPayload = json
}
throw error
}
}
if withErrorMessage, let errorCheckModel = try? JSONDecoder().decode(ErrorModel.self, from: data)
{
if let statusIsSuccess = errorCheckModel.success, let errorMessage = errorCheckModel.message, !errorMessage.isEmpty
{
if(!statusIsSuccess)
{
print(urlString)
GRP.showToast(failure: true, …Run Code Online (Sandbox Code Playgroud)