我有一个基于 .net core 2.0 的 web api 项目。
我几乎遵循了http://kevinchalet.com/2017/01/30/implementing-simple-token-authentication-in-aspnet-core-with-openiddict/上的非常好的例子。
返回身份验证的 SignIn() 结果的代码。方法看起来像这样:
if (request.IsPasswordGrantType())
{
// (...)
if (useraccount != null && useraccount.Failcount <= AppConstants.AuthMaxAllowedFailedLogin)
{
var identity = new ClaimsIdentity(OpenIdConnectServerDefaults.AuthenticationScheme, OpenIdConnectConstants.Claims.Name, OpenIdConnectConstants.Claims.Role);
identity.AddClaim(OpenIdConnectConstants.Claims.Subject, AppConstants.AuthSubjectClaim, OpenIdConnectConstants.Destinations.AccessToken);
identity.AddClaim(OpenIdConnectConstants.Claims.Name, useraccount.Username, OpenIdConnectConstants.Destinations.AccessToken);
return SignIn(new ClaimsPrincipal(identity), OpenIdConnectServerDefaults.AuthenticationScheme);
}
// (...)
}
Run Code Online (Sandbox Code Playgroud)
我的启动代码如下所示:
services.AddDbContext<DbContext>(options =>
{
options.UseInMemoryDatabase(nameof(DbContext));
options.UseOpenIddict();
});
services.AddOpenIddict(options =>
{
options.AddEntityFrameworkCoreStores<DbContext>();
options.AddMvcBinders();
options.EnableTokenEndpoint(DcpConstants.ApiTokenRoute);
options.AllowPasswordFlow();
options.AllowRefreshTokenFlow();
options.SetAccessTokenLifetime(TimeSpan.FromHours(1));
options.SetRefreshTokenLifetime(TimeSpan.FromDays(1));
options.DisableHttpsRequirement();
});
services.AddAuthentication(options =>
{
options.DefaultScheme = OAuthValidationDefaults.AuthenticationScheme;
}).AddOAuthValidation();
Run Code Online (Sandbox Code Playgroud)
现在,当我使用以下参数发送 post 请求时:
username: foo@bar.com …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个使用 Authlib OAuth2 服务器获取刷新令牌的简单工具,但此处的示例服务器不发出刷新令牌。当我打印令牌时,我得到以下信息:
{'access_token': '....', 'scope': 'profile', 'token_type': 'Bearer', 'expires_in': 864000, 'expires_at': 1532191887}
Run Code Online (Sandbox Code Playgroud)
流程是此处提到的授权代码;首先我处理同意部分:
client_id = '...'
client_secret = '.....'
scope = '...'
session = OAuth2Session(client_id, client_secret, scope=scope)
authorize_url = '.../oauth/authorize'
uri, state = session.authorization_url(authorize_url)
Run Code Online (Sandbox Code Playgroud)
然后我尝试获取令牌:
urlset = '.../?code=...&state=...'
access_token_url = '.../oauth/token'
token = session.fetch_access_token(access_token_url,authorization_response=urlset)
Run Code Online (Sandbox Code Playgroud) 在我们的 Web 应用程序 (ASP.NET) 中,我们使用 OpenID Connect 和授权代码流:
这是有效的——除了我们无法刷新 ID 令牌,因此用户在 1 小时后超时,需要重新登录。根据 OpenID Connect 规范,当使用令牌端点刷新令牌时,并非所有 OpenID Connect 提供者都会提供新的 ID 令牌。
到目前为止我们看到的替代方案:
那么在较长时间内保留用户登录的推荐方法是什么?将访问令牌与 UserInfo 端点一起使用是合适的解决方案吗?
访问 Google-Drive 时,访问令牌可能会过期,我们可以使用刷新令牌来获取新的访问令牌。不过,刷新令牌本身停止工作或过期的可能原因有很多,请参阅:
https://developers.google.com/identity/protocols/OAuth2#expiration
所以我的问题是,如果刷新令牌在 6 个月后过期会发生什么,我如何检测它?刷新访问令牌的请求是否因403 禁止而失败,或者是否返回包含错误消息的 JSON,或者其他内容?
不幸的是很难找到这方面的任何信息,要测试它必须等待 6 个月......
解决方案:
感谢 Gary Archers 的回答,我可以使用无效的刷新令牌来产生这种情况,这是我得到的响应,也许它可以帮助其他人:
HTTP-status-code: 400
JSON:
{
"error": "invalid_grant",
"error_description": "Bad Request"
}
Run Code Online (Sandbox Code Playgroud) 我们有这份文档解释了如何使用自定义策略设置让我登录 (KMSI):https ://docs.microsoft.com/en-us/azure/active-directory-b2c/custom-policy-keep -我已登录
好的,太好了,所以我们现在知道如何使用(令人讨厌的复杂)XML 策略文件为复选框设置一些 UI。但这实际上是在做什么? 哪里有这方面的资料?
我的理解是,对于隐式授予,存储刷新令牌是不可能的,因此保留会话 cookie 并使用它通过 i-frame 获取新会话prompt=none是一个 HACK,能够保持会话 cookie 更新和最新。
这是前 MS(现为 Auth0)身份专家 Vittorio 的一篇文章:https ://auth0.com/blog/oauth2-implicit-grant-and-spa/
他提到了Refresh Token Rotation 的“ Renewing Access Tokens ” 。这被描述为:
“一种使刷新令牌无效并在用于刷新访问令牌时发出新令牌的功能”
这似乎是通过会话 cookie 和 i-frame“hack”(与隐式授权一起使用)来完成的,它返回一个新的授权代码,(大概)可以用来获取新的访问令牌。
当我们现在拥有 PKCE 时,为什么需要这样做? 显然,即使使用 PKCE,在浏览器中存储长期存在的刷新令牌仍然很糟糕。我发现未记录的信息表明SPA 最大生命周期的 B2C 刷新令牌为 24 小时(不是 90 天,并且不可配置)。 …
我在我的应用程序中使用基于令牌的身份验证 我的后端是使用restful service(spring)开发的.后端代码很好地生成了所需的访问令牌和刷新令牌的时间轴,所以我已经覆盖了以下的http类:
export class customHttp extends Http {
headers: Headers = new Headers({ 'Something': 'Something' });
options1: RequestOptions = new RequestOptions({ headers: this.headers });
private refreshTokenUrl = AppSettings.REFRESH_TOKEN_URL;
constructor(backend: ConnectionBackend,
defaultOptions: RequestOptions,private refresh:OauthTokenService) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
console.log("custom http ");
return super.request(url, options)
.catch((err) => {
if (err.status === 401) {
console.log(" custome http 401 ");
// refresh the token
this.refresh.refresh().subscribe((tokenObj)=>{
console.log("tokenobj ");
})
} else {
console.log("err " + err); …Run Code Online (Sandbox Code Playgroud) 我正在使用以下 API
https://bitbucket.org/site/oauth2/authorize?client_id={client_id}&response_type=token
Run Code Online (Sandbox Code Playgroud)
获取 access_token 但 access_token 在 1 小时后过期,我需要 refresh_token 但我无法在上述 API 的响应中获取 refresh_token。上述API的响应是
https://www.example.com/#access_token={access_token}&scopes={scopes}&expires_in=3600&token_type=bearer
Run Code Online (Sandbox Code Playgroud)
您可以在上面的回复中看到没有或者是否有其他方法可以获得 refresh_token。
我想将上述 API 调用为 GET 方法。
可以请人帮忙。
谢谢你!
我目前正在实施Contact Applicationusing Google Contact APIin Java。我已完成授权步骤并获得访问令牌和刷新令牌。
现在我有了CLIENT_ID , CLIENT_SECRET AND REFRESH_TOKEN。但是访问令牌将在一个小时内过期。
有人可以告诉如何在 Java 中使用刷新令牌自动生成访问令牌吗?
我正在尝试接收refresh_token我的 Ionic 应用程序,我成功接收了access_token.
我从我的 TypeScript 项目中的端点接收code(authorization_code或access_token)https://accounts.spotify.com/authorize?client_id=,我将它传递cURL给测试如何获取refresh_token但唯一收到错误的东西。
curl -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: Basic MzBhNT...ZWIyZWQ=" -d grant_type=authorization_code -d code=BQAjgZOFne3p8PB4ARJkrXtq...kI4xJvhQ7SutZoJqVWILCY -d redirect_uri=http%3A%2F%2Flocalhost%3A8100%2Fmain -X POST https://accounts.spotify.com/api/token
Run Code Online (Sandbox Code Playgroud)
预期输出:
{
"access_token": "NgCXRK...MzYjw",
"token_type": "Bearer",
"scope": ...,
"expires_in": 3600,
"refresh_token": "NgAagA...Um_SHo"
}
Run Code Online (Sandbox Code Playgroud)
但收到错误:
{"error":"invalid_grant","error_description":"Invalid authorization code"}
Run Code Online (Sandbox Code Playgroud) 场景是:
Error: GraphQL error: unauthorized.onErrorfromapollo-link-error方法捕获错误,并且可以从中调用refreshToken()(它需要过期的 jwt)。这是目前我的代码:
const errorLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors) {
refreshToken();
}
});
const link = ApolloLink.from([errorLink, terminatingLink]);
Run Code Online (Sandbox Code Playgroud)
我们如何改进此流程,以便在用户发出请求时刷新令牌而不会出错?如果请求导致错误,则类似请求将被“搁置”,然后一旦刷新令牌,就会对其进行处理。但我不知道如何做到这一点。
或者我们有没有其他方法可以改进这个流程?
refresh-token ×10
access-token ×4
oauth-2.0 ×3
javascript ×2
token ×2
angular ×1
asp.net ×1
asp.net-core ×1
authlib ×1
azure-ad-b2c ×1
bitbucket ×1
c# ×1
google-oauth ×1
graphql ×1
http-post ×1
insomnia ×1
java ×1
jwt ×1
oauth ×1
onedrive ×1
openiddict ×1
pkce ×1
spotify ×1
typescript ×1