我正在使用附带有OWIN中间件的Visual Studio 2013 Web Api 2模板进行用户认证等操作。
注意到在OAuthAuthorizationServerOptions
里设置了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_token,并且可以使用refresh_token
来刷新。
我已经搜索了很多,但没有找到任何有用的东西。
所以现在我做到这个地步了。我已经编写了一个实现了IAuthenticationTokenProvider
接口的RefreshTokenProvider
:
它可以作为OAuthAuthorizationServerOptions
类中的RefreshTokenProvider
属性使用。
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头的请求到我的令牌端点吗?
我在打字时正在思考...我应该在我的 SimpleRefreshTokenProvider
中处理 refresh_token
的过期吗?客户端如何获取一个新的 refresh_token
?
我真的需要一些阅读材料/文档,因为我不想做错,想要遵循某种标准。