Я использую шаблон Web Api 2, который поставляется с Visual Studio 2013, имеет некоторое промежуточное ПО OWIN для аутентификации пользователей и т.д.
В 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_tokens, которые можно обновить, используя refresh_token
Я сделал много поисковых запросов и не нашел ничего полезного.
Так вот, как далеко я успел добраться. Теперь я достиг точки "WTF do я now".
Я написал a 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-заголовками?
Просто задумываясь вслух, когда я печатаю... Должен ли я обрабатывать expresh_token expiration в моем SimpleRefreshTokenProvider
? Как клиент получит новый refresh_token
?
Я действительно мог бы поработать с некоторыми материалами для чтения/документацией, потому что я не хочу ошибаться и хотел бы следовать стандарту.