From 18729a05e59c93eb258eb0a72cf2af4c22b28041 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Thu, 8 Oct 2015 18:40:00 -0700 Subject: Polishing of C# auth API --- src/csharp/Grpc.Auth/AuthInterceptors.cs | 86 ----------------------- src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs | 86 +++++++++++++++++++++++ src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs | 96 ++++++++++++++++++++++++++ src/csharp/Grpc.Auth/Grpc.Auth.csproj | 4 +- src/csharp/Grpc.Auth/GrpcCredentials.cs | 93 ------------------------- 5 files changed, 184 insertions(+), 181 deletions(-) delete mode 100644 src/csharp/Grpc.Auth/AuthInterceptors.cs create mode 100644 src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs create mode 100644 src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs delete mode 100644 src/csharp/Grpc.Auth/GrpcCredentials.cs (limited to 'src/csharp/Grpc.Auth') diff --git a/src/csharp/Grpc.Auth/AuthInterceptors.cs b/src/csharp/Grpc.Auth/AuthInterceptors.cs deleted file mode 100644 index fa92566775..0000000000 --- a/src/csharp/Grpc.Auth/AuthInterceptors.cs +++ /dev/null @@ -1,86 +0,0 @@ -#region Copyright notice and license - -// Copyright 2015, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#endregion - -using System; -using System.Threading; - -using Google.Apis.Auth.OAuth2; -using Grpc.Core; -using Grpc.Core.Utils; - -namespace Grpc.Auth -{ - /// - /// Factory methods to create authorization interceptors. - /// - /// - public static class AuthInterceptors - { - private const string AuthorizationHeader = "Authorization"; - private const string Schema = "Bearer"; - - /// - /// Creates an that will obtain access token from any credential type that implements - /// ITokenAccess. (e.g. GoogleCredential). - /// - /// The credential to use to obtain access tokens. - /// The interceptor. - public static AsyncAuthInterceptor FromCredential(ITokenAccess credential) - { - return new AsyncAuthInterceptor(async (authUri, metadata) => - { - var accessToken = await credential.GetAccessTokenForRequestAsync(authUri, CancellationToken.None).ConfigureAwait(false); - metadata.Add(CreateBearerTokenHeader(accessToken)); - }); - } - - /// - /// Creates an that will use given access token as authorization. - /// - /// OAuth2 access token. - /// The interceptor. - public static AsyncAuthInterceptor FromAccessToken(string accessToken) - { - Preconditions.CheckNotNull(accessToken); - return new AsyncAuthInterceptor(async (authUri, metadata) => - { - metadata.Add(CreateBearerTokenHeader(accessToken)); - }); - } - - private static Metadata.Entry CreateBearerTokenHeader(string accessToken) - { - return new Metadata.Entry(AuthorizationHeader, Schema + " " + accessToken); - } - } -} diff --git a/src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs b/src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs new file mode 100644 index 0000000000..1c14c5bb5b --- /dev/null +++ b/src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs @@ -0,0 +1,86 @@ +#region Copyright notice and license + +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Threading; + +using Google.Apis.Auth.OAuth2; +using Grpc.Core; +using Grpc.Core.Utils; + +namespace Grpc.Auth +{ + /// + /// Factory methods to create authorization interceptors for Google credentials. + /// + /// + public static class GoogleAuthInterceptors + { + private const string AuthorizationHeader = "Authorization"; + private const string Schema = "Bearer"; + + /// + /// Creates an that will obtain access token from any credential type that implements + /// ITokenAccess. (e.g. GoogleCredential). + /// + /// The credential to use to obtain access tokens. + /// The interceptor. + public static AsyncAuthInterceptor FromCredential(ITokenAccess credential) + { + return new AsyncAuthInterceptor(async (authUri, metadata) => + { + var accessToken = await credential.GetAccessTokenForRequestAsync(authUri, CancellationToken.None).ConfigureAwait(false); + metadata.Add(CreateBearerTokenHeader(accessToken)); + }); + } + + /// + /// Creates an that will use given access token as authorization. + /// + /// OAuth2 access token. + /// The interceptor. + public static AsyncAuthInterceptor FromAccessToken(string accessToken) + { + Preconditions.CheckNotNull(accessToken); + return new AsyncAuthInterceptor(async (authUri, metadata) => + { + metadata.Add(CreateBearerTokenHeader(accessToken)); + }); + } + + private static Metadata.Entry CreateBearerTokenHeader(string accessToken) + { + return new Metadata.Entry(AuthorizationHeader, Schema + " " + accessToken); + } + } +} diff --git a/src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs b/src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs new file mode 100644 index 0000000000..a1e7db13bd --- /dev/null +++ b/src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs @@ -0,0 +1,96 @@ +#region Copyright notice and license + +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Threading; +using System.Threading.Tasks; + +using Google.Apis.Auth.OAuth2; +using Grpc.Core; +using Grpc.Core.Utils; + +namespace Grpc.Auth +{ + /// + /// Factory/extension methods to create instances of and classes + /// based on credential objects originating from Google auth library. + /// + public static class GoogleGrpcCredentials + { + /// + /// Retrieves an instance of Google's Application Default Credentials using + /// GoogleCredential.GetApplicationDefaultAsync() and converts them + /// into a gRPC that use the default SSL credentials. + /// + /// The ChannelCredentials instance. + public static async Task GetApplicationDefaultAsync() + { + var googleCredential = await GoogleCredential.GetApplicationDefaultAsync().ConfigureAwait(false); + return googleCredential.ToChannelCredentials(); + } + + /// + /// Creates an instance of that will use given access token to authenticate + /// with a gRPC service. + /// + /// OAuth2 access token. + /// /// The MetadataCredentials instance. + public static CallCredentials FromAccessToken(string accessToken) + { + return CallCredentials.FromInterceptor(GoogleAuthInterceptors.FromAccessToken(accessToken)); + } + + /// + /// Converts a ITokenAccess (e.g. GoogleCredential) object + /// into a gRPC object. + /// + /// The credential to use to obtain access tokens. + /// The CallCredentials instance. + public static CallCredentials ToCallCredentials(this ITokenAccess credential) + { + return CallCredentials.FromInterceptor(GoogleAuthInterceptors.FromCredential(credential)); + } + + /// + /// Converts a ITokenAccess (e.g. GoogleCredential) object + /// into a gRPC object. + /// Default SSL credentials are used. + /// + /// The credential to use to obtain access tokens. + /// >The ChannelCredentials instance. + public static ChannelCredentials ToChannelCredentials(this ITokenAccess googleCredential) + { + return ChannelCredentials.Create(new SslCredentials(), googleCredential.ToCallCredentials()); + } + } +} diff --git a/src/csharp/Grpc.Auth/Grpc.Auth.csproj b/src/csharp/Grpc.Auth/Grpc.Auth.csproj index 80ab07d2ae..55bde6e194 100644 --- a/src/csharp/Grpc.Auth/Grpc.Auth.csproj +++ b/src/csharp/Grpc.Auth/Grpc.Auth.csproj @@ -78,9 +78,9 @@ Version.cs - + - + diff --git a/src/csharp/Grpc.Auth/GrpcCredentials.cs b/src/csharp/Grpc.Auth/GrpcCredentials.cs deleted file mode 100644 index d8b10804c6..0000000000 --- a/src/csharp/Grpc.Auth/GrpcCredentials.cs +++ /dev/null @@ -1,93 +0,0 @@ -#region Copyright notice and license - -// Copyright 2015, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#endregion - -using System; -using System.Threading; - -using Google.Apis.Auth.OAuth2; -using Grpc.Core; -using Grpc.Core.Utils; - -namespace Grpc.Auth -{ - /// - /// Factory methods to create instances of and classes. - /// - public static class GrpcCredentials - { - /// - /// Creates a instance that will obtain access tokens - /// from any credential that implements ITokenAccess. (e.g. GoogleCredential). - /// - /// The credential to use to obtain access tokens. - /// The MetadataCredentials instance. - public static MetadataCredentials Create(ITokenAccess credential) - { - return new MetadataCredentials(AuthInterceptors.FromCredential(credential)); - } - - /// - /// Convenience method to create a instance from - /// ITokenAccess credential and SslCredentials instance. - /// - /// The credential to use to obtain access tokens. - /// The SslCredentials instance. - /// The channel credentials for access token based auth over a secure channel. - public static ChannelCredentials Create(ITokenAccess credential, SslCredentials sslCredentials) - { - return ChannelCredentials.Create(sslCredentials, Create(credential)); - } - - /// - /// Creates an instance of that will use given access token to authenticate - /// with a gRPC service. - /// - /// OAuth2 access token. - /// /// The MetadataCredentials instance. - public static MetadataCredentials FromAccessToken(string accessToken) - { - return new MetadataCredentials(AuthInterceptors.FromAccessToken(accessToken)); - } - - /// - /// Converts a ITokenAccess object into a object supported - /// by gRPC. - /// - /// - /// - public static MetadataCredentials ToGrpcCredentials(this ITokenAccess credential) - { - return GrpcCredentials.Create(credential); - } - } -} -- cgit v1.2.3