Comments (6)
I see one missing point: reset token after LoginAsync()
There is a way to update the service with the token from client component code?
Your DefaultCallOptionsFactory decides which token will be used.
class ServiceModelGrpcClientOptions
{
Func<CallOptions> DefaultCallOptionsFactory { get; set; }
}
CallOptionsFactory is a function. On each call from any proxy created by the ClientFactory the infrastructure asks CallOptionsFactory for default CallOptions.
Here is your example adapted for DefaultCallOptionsFactory:
Setup:
class JwtTokenContainer : IJwtTokenContainer
{
private string _token;
public string GetToken() => _token;
public void SetToken(string value) => _token = value;
}
services.AddSingleton<IJwtTokenContainer, JwtTokenContainer>();
services.AddSingleton<IClientFactory>(provider =>
{
Func<CallOptions> callOptionsFactory = () => new CallOptions(new Metadata
{
{ "Authorization", "Bearer " + provider.GetRequiredService<IJwtTokenContainer>().GetToken() }
});
return new ClientFactory(new ServiceModelGrpcClientOptions
{
DefaultCallOptionsFactory = callOptionsFactory
});
});
services.AddSingleton<ChannelBase>(provider =>
{
var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler()));
return GrpcChannel.ForAddress(new Uri(builder.HostEnvironment.BaseAddress), new GrpcChannelOptions() { HttpClient = httpClient });
});
services.AddTransient<IAuthenticationGrpcService>(provider =>
{
var channel = provider.GetRequiredService<ChannelBase>();
var clientFactory = provider.GetRequiredService<IClientFactory>();
return clientFactory.CreateClient<IAuthenticationGrpcService>();
});
Client code:
[Inject]
private IAuthenticationGrpcService Authentication { get; set; }
[Inject]
private IJwtTokenContainer TokenContainer { get; set; }
...
var res = await Authentication.LoginAsync(request);
if (res.Result)
{
// all subsequent calls will be authenticated
TokenContainer.SetToken(res.AccessToken);
await GrpcService.Authentication.LogoutAsync();
// all subsequent calls will be anonymous
TokenContainer.SetToken(null);
}
from servicemodel.grpc.
Hi @Gambero81,
yes it's possible, see example.
from servicemodel.grpc.
Thanks @max-ieremenko,
I use a blazor wasm client, so i have the accessToken on client, after the login call.
There is a way to update the service with the token from client component code?
Actually on client i can have an injected grpc service, but it implement only the interface grpc methods and does not have properties related to DefaultCallOptions.
from servicemodel.grpc.
I solved setting the access token on default request headers of http client.
There is a better solution?
Program.cs:
builder.Services.AddSingleton(services =>
{
var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler()));
var channel = GrpcChannel.ForAddress(new Uri(builder.HostEnvironment.BaseAddress), new GrpcChannelOptions() { HttpClient = httpClient });
var clientFactory = new ClientFactory();
return new GrpcService(httpClient)
{
Authentication = clientFactory.CreateClient<IAuthenticationGrpcService>(channel)
};
});
Client code:
[Inject]
private Services.GrpcService GrpcService { get; set; }
...
var res = await GrpcService.Authentication.LoginAsync(request);
if (res.Result)
{
GrpcService.HttpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {res.AccessToken}");
await GrpcService.Authentication.LogoutAsync();
}
from servicemodel.grpc.
Thank @max-ieremenko!
from servicemodel.grpc.
hi @Gambero81,
since no activity, I am closing this issue.
If this in error, let me know with a comment and I will be happy to reopen the issue.
from servicemodel.grpc.
Related Issues (20)
- How to get request body with httpcontext? HOT 4
- implement Hub in ServiceModel.Grpc HOT 4
- Question: does this somehow relate to protobuf-net.Grpc? HOT 4
- Question: Best serialisation method for performance HOT 3
- Multiple Implementations of a Service Contract on Same Server HOT 6
- CallContext model is generated on Swagger HOT 3
- Protobuf-net and Error Handling HOT 3
- [Question] What is the namespace for creation of a Channel? HOT 2
- [Question] What is the correct way to update the value of Authorization header with every new gRPC call? HOT 2
- Throwing an exception on the server side does not work properly on the Blazor WebAssembly client side HOT 2
- how to Initialize IClientBuilder? HOT 2
- Is there dependency injection container support for client? HOT 7
- Call GRPC hosted with Blazor (Asp.Net Core Server) from Console App HOT 3
- Support for MemoryPack HOT 5
- After publishing blazor server service model in the client gives argumentoutofrangeexception HOT 4
- Design Time Issue With Return Type of Task HOT 4
- WriteClientStream hangs after the client streaming call completes. HOT 1
- IEnumerable data is not empty array, it is null? HOT 9
- MessagePackSerializationException: Building dynamic formatter only allows public type HOT 2
- Update MessagePack to 2.4.35, support DateOnly and TimeOnly HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from servicemodel.grpc.