I meant We did NOT expect the GoogleAuthLibraryCallCredentials.java to 
overwrite the audience we set.


On Friday, August 25, 2017 at 3:02:37 PM UTC+2, julie wrote:
>
> Thanks a lot for your comments!
>
>
> *Update on the issue:*
>
>
> We have modified our Client to use ServiceAccountJwtAccessCredentials 
>
>
> public static ReporterGrpc.ReporterBlockingStub createReporterStub(String 
> host, int port) throws Exception {
>
>   Channel channel = ManagedChannelBuilder.forAddress(host, port).
> usePlaintext(true).build();
>
>   ServiceAccountJwtAccessCredentials serviceAccountJwtAccessCredentials = 
> Environment.get().computeEngineDefaultCredentials();
>
>   return ReporterGrpc.newBlockingStub(channel).withCallCredentials(
>
>          new GoogleAuthLibraryCallCredentials(
> serviceAccountJwtAccessCredentials));
>
> }
>
>
>
> It works but with a change in the class 
> GoogleAuthLibraryCallCredentials.java ,
>
>
> https://github.com/grpc/grpc-java/blob/master/auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java
>
>
> Currently  the audience that  is set by  ServiceAccountJwtAccessCredentials 
> is being overwritten by the above line: 
> ReporterGrpc.*newBlockingStub*(channel).withCallCredentials(new 
> GoogleAuthLibraryCallCredentials(serviceAccountJwtAccessCredentials)) 
>
>
> So instead of the audience (SERVICE_CONFIGURATION_NAME) that we set, we 
> are obtaining a string like : https://35.195.24.28:80/reporter.Reporter
>
> Which is being constructed by 
> https://github.com/grpc/grpc-java/blob/master/auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java#L123
>
>
> After we changed the uri passed to null at : 
> https://github.com/grpc/grpc-java/blob/master/auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java#L98
>  , we were able to point to the right audience: 
>
>
> Map<String, List<String>> metadata = creds.getRequestMetadata(uri) -> Map<
> String, List<String>> metadata = creds.getRequestMetadata(null)
>
>
> Now the ServiceAccountJwtAccessCredentials 
> <https://github.com/google/google-auth-library-java/blob/master/oauth2_http/java/com/google/auth/oauth2/ServiceAccountJwtAccessCredentials.java#L252>
>  picks 
> up the right audience from this line:
>
>
> https://github.com/google/google-auth-library-java/blob/master/oauth2_http/java/com/google/auth/oauth2/ServiceAccountJwtAccessCredentials.java#L25
>  
> <https://github.com/google/google-auth-library-java/blob/master/oauth2_http/java/com/google/auth/oauth2/ServiceAccountJwtAccessCredentials.java#L252>
> 3
>
>
>     if (uri == null) {
>        if (defaultAudience != null) {
>          uri = defaultAudience;
>        } else {
>          ……
>        }
>      }
>
>
>
> Is this working as intended or did we miss something? We did expect the 
> GoogleAuthLibraryCallCredentials.java to overwrite the audience we set.
>
> We were wondering whether ServiceAccountJwtAccessCredentials class is 
> compatible with CallCredentials class or if there is another wrapper 
> available to pass the ServiceAccountJwtAccessCredentials.
>
>
>
>
>
> On Thursday, August 24, 2017 at 10:27:31 PM UTC+2, [email protected] 
> wrote:
>>
>>
>> If you require setting the JWT as an authorization Bearer token in your 
>> request for a given audience,  ServiceAccountJwtAccessCredentials is useful.
>>
>> The JWT that is created from ServiceAccountCredentials
>>
>> https://github.com/google/google-auth-library-java/blob/master/oauth2_http/java/com/google/auth/oauth2/ServiceAccountCredentials.java#L494
>>  
>> : is targeted to creating a JWT that can be provided to retrieve a Google 
>> ID Token(https://developers.google.com/identity/protocols/OpenIDConnect
>> ). 
>>
>> On Thursday, August 24, 2017 at 1:17:55 PM UTC-7, [email protected] 
>> wrote:
>>>
>>>
>>> that's really great to know to use ServiceAccountJwtAccessCredentials. 
>>> but may I ask what's the major diffs 
>>> between ServiceAccountJwtAccessCredentials and ServiceAccountCredentials. 
>>> and in which case we should use ServiceAccountCredentials?
>>>
>>> Thanks,
>>> Jun
>>>
>>> On Thursday, August 24, 2017 at 9:49:33 PM UTC+2, [email protected] 
>>> wrote:
>>>>
>>>> https://github.com/google/google-auth-library-java 
>>>> <https://github.com/google/google-auth-library-java>
>>>> provides a ServiceAccountJwtAccessCredentials you can use.
>>>>
>>>>
>>>> https://github.com/google/google-auth-library-java/blob/master/oauth2_http/java/com/google/auth/oauth2/ServiceAccountJwtAccessCredentials.java#L204
>>>>
>>>> The jwt authorization header is set with this method :
>>>>
>>>> https://github.com/google/google-auth-library-java/blob/0d27d88798b299a4eda987171f34292cec73ec6c/oauth2_http/java/com/google/auth/oauth2/ServiceAccountJwtAccessCredentials.java#L252
>>>>
>>>>
>>>> On Thursday, August 24, 2017 at 10:50:06 AM UTC-7, julie wrote:
>>>>>
>>>>> Hi, I'm trying to get my Google Cloud Endpoints project with gRPC 
>>>>> working with an OAuth2.0 authentication provider using GoogleCredentials
>>>>>
>>>>>
>>>>> I followed the steps in this tutorial and could make an authenticated 
>>>>> request by generating the jwt token and setting the audience and issuer 
>>>>> etc
>>>>>
>>>>>  
>>>>> https://cloud.google.com/endpoints/docs/using-service-to-service-authentication-grpc#make_an_authenticated_grpc_call
>>>>>
>>>>>
>>>>> But we need to use GoogleCredentials for authentication and I have 
>>>>> tried making the client request in several ways but it did not work out
>>>>>
>>>>> Below is the relevant piece of my Client code along with my 
>>>>> api_config_auth.yaml file
>>>>>
>>>>>
>>>>> *CLIENT:*
>>>>>
>>>>>
>>>>> public class ReporterClient {
>>>>>
>>>>>   public static void main(String[] args) throws Exception {
>>>>>
>>>>>  // Create gRPC stub.
>>>>>
>>>>>     ReporterGrpc.ReporterBlockingStub reporterBlockingStub = 
>>>>> createReporterStub(host, port);
>>>>>
>>>>>     getParams(reporterBlockingStub, domain, type, objectName, data);
>>>>>
>>>>>   }
>>>>>
>>>>>  //  Send Request to Server
>>>>>
>>>>>   public static void getParams(ReporterGrpc.ReporterBlockingStub 
>>>>> reporterBlockingStub,String domain, String type, String objectName, 
>>>>> String data) {
>>>>>
>>>>>     GenerateReportRequest request =  GenerateReportRequest.newBuilder
>>>>> ().setDomain(domain).setType(type).setObjectName(objectName).setData(
>>>>> data).build();
>>>>>
>>>>>     GenerateReportResponse response = reporterBlockingStub.
>>>>> generateReport(request);
>>>>>
>>>>>   }
>>>>>
>>>>> // Version 1: Without scopes
>>>>>
>>>>>   public static ReporterGrpc.ReporterBlockingStub createReporterStub(
>>>>> String host, int port) throws Exception {
>>>>>
>>>>>     Channel channel = ManagedChannelBuilder.forAddress(host, port).
>>>>> usePlaintext(true).build();
>>>>>
>>>>>     GoogleCredentials googleCredentials = Environment.get().
>>>>> computeEngineDefaultCredentials();
>>>>>
>>>>>     return ReporterGrpc.newBlockingStub(channel)
>>>>>
>>>>>         .withCallCredentials(MoreCallCredentials
>>>>>
>>>>>             .from(googleCredentials));
>>>>>
>>>>>   }
>>>>>
>>>>> // Version 2: With scopes
>>>>>
>>>>>   public static ReporterGrpc.ReporterBlockingStub 
>>>>> createReporterStubTry(String host, int port) throws Exception {
>>>>>
>>>>>     Channel channel = ManagedChannelBuilder.forAddress(host, port).
>>>>> usePlaintext(true).build();
>>>>>
>>>>>     List<String> scopes = new ArrayList<>();
>>>>>
>>>>>     scopes.add("https://MY_SERVICE_CONFIGURATION_NAME”);
>>>>>
>>>>>     GoogleCredentials googleCredentials = 
>>>>> Environment.get().computeEngineDefaultCredentials().createScoped(scopes);
>>>>>
>>>>>     return ReporterGrpc.newBlockingStub(channel)
>>>>>
>>>>>         .withCallCredentials(MoreCallCredentials
>>>>>
>>>>>             .from(googleCredentials));
>>>>>   }
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>>
>>>>> *YAML File : API_CONFIG_AUTH.yaml:*
>>>>>
>>>>>
>>>>> # Reporter gRPC API configuration.
>>>>>
>>>>> type: google.api.Service
>>>>>
>>>>> config_version: 3
>>>>>
>>>>> # Name of the service configuration.
>>>>>
>>>>> name: MY_SERVICE_CONFIGURATION_NAME
>>>>>
>>>>> # API title to appear in the user interface (Google Cloud Console).
>>>>>
>>>>> title: Reporter gRPC API
>>>>>
>>>>> apis:
>>>>>
>>>>>   - name: reporter.Reporter
>>>>>
>>>>> # API usage restrictions.
>>>>>
>>>>> usage:
>>>>>
>>>>>   rules:
>>>>>
>>>>>   # GenerateReport method can be called without an API Key.
>>>>>
>>>>>   - selector: reporter.Reporter.GenerateReport
>>>>>
>>>>>     allow_unregistered_calls: true
>>>>>
>>>>> # Request authentication.
>>>>>
>>>>> authentication:
>>>>>
>>>>>   providers:
>>>>>
>>>>>   - id: google_service_account
>>>>>
>>>>>     # Replace SERVICE-ACCOUNT-ID with your service account's email 
>>>>> address.
>>>>>
>>>>>     issuer: MY_SERVICE_ACCOUNT_ID
>>>>>
>>>>>     jwks_uri: https://
>>>>> www.googleapis.com/robot/v1/metadata/x509/MY_SERVICE_ACCOUNT_ID
>>>>>
>>>>>   rules:
>>>>>
>>>>>   # This auth rule will apply to all methods.
>>>>>
>>>>>   - selector: "*"
>>>>>
>>>>>     requirements:
>>>>>       - provider_id: google_service_account 
>>>>>
>>>>>
>>>>>
>>>>> *// Error for Version 1: Without scopes*
>>>>>
>>>>>
>>>>> Exception in thread "main" io.grpc.StatusRuntimeException: 
>>>>> PERMISSION_DENIED: JWT validation failed: Audience not allowed
>>>>>
>>>>> at 
>>>>> io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:212)
>>>>>
>>>>> at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:193)
>>>>>
>>>>> at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:126)
>>>>>
>>>>> at 
>>>>> com.soliduslink.vault.reporter.endpoints.ReporterGrpc$ReporterBlockingStub.generateReport(ReporterGrpc.java:138)
>>>>>
>>>>> at 
>>>>> com.soliduslink.vault.reporter.endpoints.ReporterClient.getParams(ReporterClient.java:143)
>>>>>
>>>>> at 
>>>>> com.soliduslink.vault.reporter.endpoints.ReporterClient.main(ReporterClient.java:118)
>>>>>
>>>>>
>>>>> *// Error for Version 2: With scopes*
>>>>>
>>>>>
>>>>> Exception in thread "main" io.grpc.StatusRuntimeException: 
>>>>> UNAUTHENTICATED
>>>>>
>>>>> at 
>>>>> io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:212)
>>>>>
>>>>> at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:193)
>>>>>
>>>>> at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:126)
>>>>>
>>>>> at 
>>>>> com.soliduslink.vault.reporter.endpoints.ReporterGrpc$ReporterBlockingStub.generateReport(ReporterGrpc.java:138)
>>>>>
>>>>> at 
>>>>> com.soliduslink.vault.reporter.endpoints.ReporterClient.getParams(ReporterClient.java:143)
>>>>>
>>>>> at 
>>>>> com.soliduslink.vault.reporter.endpoints.ReporterClient.main(ReporterClient.java:118)
>>>>>
>>>>> Caused by: java.io.IOException: Error parsing token refresh response. 
>>>>> Expected value access_token not found.
>>>>>
>>>>> at 
>>>>> com.google.auth.oauth2.OAuth2Utils.validateString(OAuth2Utils.java:116)
>>>>>
>>>>> at 
>>>>> com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:371)
>>>>>
>>>>> at 
>>>>> com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:149)
>>>>>
>>>>> at 
>>>>> com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:135)
>>>>>
>>>>> at 
>>>>> io.grpc.auth.GoogleAuthLibraryCallCredentials$1.run(GoogleAuthLibraryCallCredentials.java:95)
>>>>>
>>>>> at 
>>>>> io.grpc.stub.ClientCalls$ThreadlessExecutor.waitAndDrain(ClientCalls.java:575)
>>>>>
>>>>> at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:120) 
>>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/41b65a1c-9ca2-410d-987c-af49f053e55a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to