标签: refresh-token

不接收带有 OpenIddict 的刷新令牌

我有一个基于 .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)

c# token asp.net-core openiddict refresh-token

3
推荐指数
1
解决办法
2907
查看次数

通过授权码从lepture/Authlib获取Refresh Token

我正在尝试开发一个使用 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)

access-token oauth-2.0 refresh-token authlib

3
推荐指数
1
解决办法
608
查看次数

OpenID Connect:验证用户身份的正确方法 - ID 令牌还是访问令牌?刷新 ID 令牌?

在我们的 Web 应用程序 (ASP.NET) 中,我们使用 OpenID Connect 和授权代码流:

  1. 用户被重定向到身份提供者(例如 Azure AD),进行身份验证,
  2. 授权代码被发回我们的 Web 应用程序中的页面。
  3. 然后,我们的 Web 应用程序使用授权代码从身份服务器检索刷新令牌、id 令牌和访问令牌。这些作为 cookie 存储在客户端上(HttpOnly 标志设置为 true)。这是为了避免对服务器状态的依赖,以防用户被负载均衡器路由到不同的 Web 服务器。
  4. 当用户访问页面时,我们会验证 ID 令牌的签名和有效期,并根据应用程序中的用户数据库检查我们用于身份的声明(例如电子邮件地址或 UPN)。

这是有效的——除了我们无法刷新 ID 令牌,因此用户在 1 小时后超时,需要重新登录。根据 OpenID Connect 规范,当使用令牌端点刷新令牌时,并非所有 OpenID Connect 提供者都会提供新的 ID 令牌。

到目前为止我们看到的替代方案:

  1. 根本不要使用 ID 令牌。使用访问令牌查询用户声明的 UserInfo 端点,并将其缓存在服务器上(在缓存未命中时,例如,如果路由到不同的 Web 服务器 - 只需使用 cookie 中提供的访问令牌再次请求 UserInfo)。由于可以刷新访问令牌,这可能会正常工作。
    • 优点:我们得到一个正确刷新的令牌,由服务器验证。
    • 缺点:并非所有声明(例如 aud 和 iss)都由 UserInfo 端点提供,至少对于 Azure AD 而言。
  2. 不要验证 ID 令牌的到期时间,只要它不超过例如 12 小时。
    • 优点:简单,只需很少的努力就可以改变当前的行为。拥有我们今天也拥有的所有声明。
    • 缺点:可能存在安全风险?注释?

那么在较长时间内保留用户登录的推荐方法是什么?将访问令牌与 UserInfo 端点一起使用是合适的解决方案吗?

asp.net authentication openid-connect refresh-token

3
推荐指数
1
解决办法
1723
查看次数

如何检测 OAuth2 刷新令牌何时过期

访问 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)

oauth oauth-2.0 google-oauth onedrive refresh-token

3
推荐指数
1
解决办法
7527
查看次数

Azure B2C 中的 KMSI 实际上做什么?

我们有这份文档解释了如何使用自定义策略设置让我登录 (KMSI):https ://docs.microsoft.com/en-us/azure/active-directory-b2c/custom-policy-keep -我已登录

好的,太好了,所以我们现在知道如何使用(令人讨厌的复杂)XML 策略文件为复选框设置一些 UI。但这实际上是在做什么? 哪里有这方面的资料?

  • 它是否为客户端提供了一个新的 ID 令牌而无需重新验证?
  • 它是否提供了新的 auth_code?
  • 是否使用了隐藏的 i-frame?
  • 如何从客户端应用程序实际调用/完成刷新?(温泉)
  • 是否需要往返 B2C,它只是不要求用户提供凭据并将它们直接重定向回应用程序?或者应用程序是否能够使刷新请求完全 UI/UX 静默?如果是这样,如何?API在哪里?需要 MSAL.js 中的某些东西吗?
  • 为什么只有本地?如果 B2C 是“中间人”IDP,并且它发行的代币是它自己的(当然实际上不是来自社交帐户),那么为什么不能以这种方式为所有帐户类型(本地或社交)刷新代币?

我的理解是,对于隐式授予,存储刷新令牌是不可能的,因此保留会话 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 天,并且不可配置)。 …

azure-ad-b2c refresh-token pkce

3
推荐指数
1
解决办法
526
查看次数

如何使用角度2中的自定义http刷新访问令牌?

我在我的应用程序中使用基于令牌的身份验证 我的后端是使用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)

javascript oauth-2.0 typescript refresh-token angular

2
推荐指数
1
解决办法
6092
查看次数

如何获取bitbucket的refresh_token?

我正在使用以下 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 方法。

可以请人帮忙。

谢谢你!

bitbucket token bitbucket-api access-token refresh-token

2
推荐指数
1
解决办法
2136
查看次数

如何在 Java 中使用刷新令牌获取访问令牌?

我目前正在实施Contact Applicationusing Google Contact APIin Java。我已完成授权步骤并获得访问令牌刷新令牌

现在我有了CLIENT_ID , CLIENT_SECRET AND REFRESH_TOKEN。但是访问令牌将在一个小时内过期。

有人可以告诉如何在 Java 中使用刷新令牌自动生成访问令牌吗?

java google-contacts-api access-token refresh-token

2
推荐指数
2
解决办法
6754
查看次数

从 Spotify API 请求 reshresh_token 时如何修复“错误:invalid_grant 无效授权码”?

我正在尝试接收refresh_token我的 Ionic 应用程序,我成功接收了access_token.

我从我的 TypeScript 项目中的端点接收codeauthorization_codeaccess_tokenhttps://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)

javascript http-post spotify refresh-token insomnia

2
推荐指数
1
解决办法
4909
查看次数

当令牌过期时,在 graphQL 客户端使用刷新令牌

场景是:

  1. Web 应用程序已打开但令牌已过期。
  2. 用户然后执行一些操作来发出 api 请求。
  3. GraphQL 返回Error: GraphQL error: unauthorized.
  4. 由于错误,应用程序没有响应。糟糕的用户体验。
  5. onErrorfromapollo-link-error方法捕获错误,并且可以从中调用refreshToken()(它需要过期的 jwt)。
  6. 生成并存储新令牌以供使用。
  7. 下一个用户操作将按正常进行。

这是目前我的代码:

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors) {
    refreshToken();
  }
});

const link = ApolloLink.from([errorLink, terminatingLink]);
Run Code Online (Sandbox Code Playgroud)

我们如何改进此流程,以便在用户发出请求时刷新令牌而不会出错?如果请求导致错误,则类似请求将被“搁置”,然后一旦刷新令牌,就会对其进行处理。但我不知道如何做到这一点。

或者我们有没有其他方法可以改进这个流程?

error-handling access-token jwt graphql refresh-token

2
推荐指数
1
解决办法
1991
查看次数