xref: /aosp_15_r20/external/grpc-grpc/examples/objective-c/auth_sample/MakeRPCViewController.m (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker/*
2*cc02d7e2SAndroid Build Coastguard Worker *
3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker *
5*cc02d7e2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker *
9*cc02d7e2SAndroid Build Coastguard Worker *     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker *
11*cc02d7e2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker * limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker *
17*cc02d7e2SAndroid Build Coastguard Worker */
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Worker#import "MakeRPCViewController.h"
20*cc02d7e2SAndroid Build Coastguard Worker
21*cc02d7e2SAndroid Build Coastguard Worker#import <AuthTestService/AuthSample.pbrpc.h>
22*cc02d7e2SAndroid Build Coastguard Worker#import <Google/SignIn.h>
23*cc02d7e2SAndroid Build Coastguard Worker#import <ProtoRPC/ProtoRPC.h>
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard WorkerNSString * const kTestScope = @"https://www.googleapis.com/auth/xapi.zoo";
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Workerstatic NSString * const kTestHostAddress = @"grpc-test.sandbox.googleapis.com";
28*cc02d7e2SAndroid Build Coastguard Worker
29*cc02d7e2SAndroid Build Coastguard Worker// Category for RPC errors to create the descriptions as we want them to appear on our view.
30*cc02d7e2SAndroid Build Coastguard Worker@interface NSError (AuthSample)
31*cc02d7e2SAndroid Build Coastguard Worker- (NSString *)UIDescription;
32*cc02d7e2SAndroid Build Coastguard Worker@end
33*cc02d7e2SAndroid Build Coastguard Worker
34*cc02d7e2SAndroid Build Coastguard Worker@implementation NSError (AuthSample)
35*cc02d7e2SAndroid Build Coastguard Worker- (NSString *)UIDescription {
36*cc02d7e2SAndroid Build Coastguard Worker  if (self.code == GRPCErrorCodeUnauthenticated) {
37*cc02d7e2SAndroid Build Coastguard Worker    // Authentication error. OAuth2 specifies we'll receive a challenge header.
38*cc02d7e2SAndroid Build Coastguard Worker    // |userInfo[kGRPCHeadersKey]| is the dictionary of response headers.
39*cc02d7e2SAndroid Build Coastguard Worker    NSString *challengeHeader = self.userInfo[kGRPCHeadersKey][@"www-authenticate"] ?: @"";
40*cc02d7e2SAndroid Build Coastguard Worker    return [@"Invalid credentials. Server challenge:\n" stringByAppendingString:challengeHeader];
41*cc02d7e2SAndroid Build Coastguard Worker  } else {
42*cc02d7e2SAndroid Build Coastguard Worker    // Any other error.
43*cc02d7e2SAndroid Build Coastguard Worker    return [NSString stringWithFormat:@"Unexpected RPC error %li: %@",
44*cc02d7e2SAndroid Build Coastguard Worker            (long)self.code, self.localizedDescription];
45*cc02d7e2SAndroid Build Coastguard Worker  }
46*cc02d7e2SAndroid Build Coastguard Worker}
47*cc02d7e2SAndroid Build Coastguard Worker@end
48*cc02d7e2SAndroid Build Coastguard Worker
49*cc02d7e2SAndroid Build Coastguard Worker@interface MakeRPCViewController ()<GRPCProtoResponseHandler>
50*cc02d7e2SAndroid Build Coastguard Worker
51*cc02d7e2SAndroid Build Coastguard Worker@end
52*cc02d7e2SAndroid Build Coastguard Worker
53*cc02d7e2SAndroid Build Coastguard Worker@implementation MakeRPCViewController
54*cc02d7e2SAndroid Build Coastguard Worker
55*cc02d7e2SAndroid Build Coastguard Worker- (dispatch_queue_t)dispatchQueue {
56*cc02d7e2SAndroid Build Coastguard Worker  return dispatch_get_main_queue();
57*cc02d7e2SAndroid Build Coastguard Worker}
58*cc02d7e2SAndroid Build Coastguard Worker
59*cc02d7e2SAndroid Build Coastguard Worker- (void)viewWillAppear:(BOOL)animated {
60*cc02d7e2SAndroid Build Coastguard Worker
61*cc02d7e2SAndroid Build Coastguard Worker  // Create a service client and a proto request as usual.
62*cc02d7e2SAndroid Build Coastguard Worker  AUTHTestService *client = [[AUTHTestService alloc] initWithHost:kTestHostAddress];
63*cc02d7e2SAndroid Build Coastguard Worker
64*cc02d7e2SAndroid Build Coastguard Worker  AUTHRequest *request = [AUTHRequest message];
65*cc02d7e2SAndroid Build Coastguard Worker  request.fillUsername = YES;
66*cc02d7e2SAndroid Build Coastguard Worker  request.fillOauthScope = YES;
67*cc02d7e2SAndroid Build Coastguard Worker
68*cc02d7e2SAndroid Build Coastguard Worker  // Set the request header with call options
69*cc02d7e2SAndroid Build Coastguard Worker  GRPCMutableCallOptions *options = [[GRPCMutableCallOptions alloc] init];
70*cc02d7e2SAndroid Build Coastguard Worker  options.oauth2AccessToken = GIDSignIn.sharedInstance.currentUser.authentication.accessToken;
71*cc02d7e2SAndroid Build Coastguard Worker  GRPCUnaryProtoCall *call = [client unaryCallWithMessage:request
72*cc02d7e2SAndroid Build Coastguard Worker                                          responseHandler:self
73*cc02d7e2SAndroid Build Coastguard Worker                                              callOptions:options];
74*cc02d7e2SAndroid Build Coastguard Worker  [call start];
75*cc02d7e2SAndroid Build Coastguard Worker
76*cc02d7e2SAndroid Build Coastguard Worker  self.mainLabel.text = @"Waiting for RPC to complete...";
77*cc02d7e2SAndroid Build Coastguard Worker}
78*cc02d7e2SAndroid Build Coastguard Worker
79*cc02d7e2SAndroid Build Coastguard Worker- (void)didReceiveProtoMessage:(GPBMessage *)message {
80*cc02d7e2SAndroid Build Coastguard Worker  AUTHResponse *response = (AUTHResponse *)message;
81*cc02d7e2SAndroid Build Coastguard Worker  if (response) {
82*cc02d7e2SAndroid Build Coastguard Worker    // This test server responds with the email and scope of the access token it receives.
83*cc02d7e2SAndroid Build Coastguard Worker    self.mainLabel.text = [NSString stringWithFormat:@"Used scope: %@ on behalf of user %@",
84*cc02d7e2SAndroid Build Coastguard Worker                           response.oauthScope, response.username];
85*cc02d7e2SAndroid Build Coastguard Worker  }
86*cc02d7e2SAndroid Build Coastguard Worker}
87*cc02d7e2SAndroid Build Coastguard Worker
88*cc02d7e2SAndroid Build Coastguard Worker- (void)didCloseWithTrailingMetadata:(NSDictionary *)trailingMetadata error:(NSError *)error {
89*cc02d7e2SAndroid Build Coastguard Worker  if (error) {
90*cc02d7e2SAndroid Build Coastguard Worker    self.mainLabel.text = error.UIDescription;
91*cc02d7e2SAndroid Build Coastguard Worker  }
92*cc02d7e2SAndroid Build Coastguard Worker}
93*cc02d7e2SAndroid Build Coastguard Worker
94*cc02d7e2SAndroid Build Coastguard Worker@end
95