我正在使用Visual Studio 2013随附的Web Api 2模板,该模板具有一些OWIN中间件来进行用户身份验证等。
在OAuthAuthorizationServerOptions
I中,我注意到OAuth2服务器已设置为发放在14天内到期的令牌
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
这不适合我的最新项目。我想分发短暂的bearer_tokens,可以使用refresh_token
我已经进行了大量谷歌搜索,找不到任何有用的信息。
这就是我设法取得的成就。我现在已经达到“现在就做WTF”这一点。
我写了一个根据类的属性RefreshTokenProvider
实现的:IAuthenticationTokenProvider
RefreshTokenProvider
OAuthAuthorizationServerOptions
public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider
{
private static ConcurrentDictionary<string, AuthenticationTicket> _refreshTokens = new ConcurrentDictionary<string, AuthenticationTicket>();
public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
var guid = Guid.NewGuid().ToString();
_refreshTokens.TryAdd(guid, context.Ticket);
// hash??
context.SetToken(guid);
}
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
AuthenticationTicket ticket;
if (_refreshTokens.TryRemove(context.Token, out ticket))
{
context.SetTicket(ticket);
}
}
public void Create(AuthenticationTokenCreateContext context)
{
throw new NotImplementedException();
}
public void Receive(AuthenticationTokenReceiveContext context)
{
throw new NotImplementedException();
}
}
// Now in my Startup.Auth.cs
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(2),
AllowInsecureHttp = true,
RefreshTokenProvider = new RefreshTokenProvider() // This is my test
};
因此,现在当有人请求bearer_token
我时refresh_token
,我正在发送,这很棒。
因此,现在如何使用该refresh_token获取一个新的bearer_token
(大概需要将请求发送给具有某些特定HTTP标头的令牌端点)?
在输入时大声思考...我应该处理我的refresh_token到期SimpleRefreshTokenProvider
吗?客户将如何获得新的refresh_token
?
我真的可以使用一些阅读材料/文档,因为我不想弄错这一点,而是想遵循某种标准。