-
Notifications
You must be signed in to change notification settings - Fork 870
/
MainActivity.java
195 lines (173 loc) · 8.25 KB
/
MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/*
* Copyright 2015 The AppAuth for Android Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.openid.appauthdemo;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.ColorRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.openid.appauth.AuthState;
import net.openid.appauth.AuthorizationException;
import net.openid.appauth.AuthorizationRequest;
import net.openid.appauth.AuthorizationService;
import net.openid.appauth.AuthorizationServiceConfiguration;
import net.openid.appauth.ClientSecretBasic;
import net.openid.appauth.RegistrationRequest;
import net.openid.appauth.RegistrationResponse;
import net.openid.appauth.ResponseTypeValues;
import java.util.Arrays;
import java.util.List;
/**
* Demonstrates the usage of the AppAuth library to connect to a set of pre-configured
* OAuth2 providers.
*
* <p><em>NOTE</em>: From a clean checkout of this project, no IDPs are automatically configured.
* Edit {@code res/values/idp_configs.xml} to specify the required configuration properties to
* enable the IDPs you wish to test. If you wish to add additional IDPs for testing, please see
* {@link IdentityProvider}.
*/
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private AuthorizationService mAuthService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuthService = new AuthorizationService(this);
ViewGroup idpButtonContainer = (ViewGroup) findViewById(R.id.idp_button_container);
List<IdentityProvider> providers = IdentityProvider.getEnabledProviders(this);
findViewById(R.id.sign_in_container).setVisibility(
providers.isEmpty() ? View.GONE : View.VISIBLE);
findViewById(R.id.no_idps_configured).setVisibility(
providers.isEmpty() ? View.VISIBLE : View.GONE);
for (final IdentityProvider idp : providers) {
final AuthorizationServiceConfiguration.RetrieveConfigurationCallback retrieveCallback =
new AuthorizationServiceConfiguration.RetrieveConfigurationCallback() {
@Override
public void onFetchConfigurationCompleted(
@Nullable AuthorizationServiceConfiguration serviceConfiguration,
@Nullable AuthorizationException ex) {
if (ex != null) {
Log.w(TAG, "Failed to retrieve configuration for " + idp.name, ex);
} else {
Log.d(TAG, "configuration retrieved for " + idp.name
+ ", proceeding");
if (idp.getClientId() == null) {
// Do dynamic client registration if no client_id
makeRegistrationRequest(serviceConfiguration, idp);
} else {
makeAuthRequest(serviceConfiguration, idp, null);
}
}
}
};
FrameLayout idpButton = new FrameLayout(this);
idpButton.setBackgroundResource(idp.buttonImageRes);
idpButton.setContentDescription(
getResources().getString(idp.buttonContentDescriptionRes));
idpButton.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
idpButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "initiating auth for " + idp.name);
idp.retrieveConfig(MainActivity.this, retrieveCallback);
}
});
TextView label = new TextView(this);
label.setText(idp.name);
label.setTextColor(getColorCompat(idp.buttonTextColorRes));
label.setLayoutParams(new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT,
Gravity.CENTER));
idpButton.addView(label);
idpButtonContainer.addView(idpButton);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mAuthService.dispose();
}
private void makeAuthRequest(
@NonNull AuthorizationServiceConfiguration serviceConfig,
@NonNull IdentityProvider idp,
@Nullable AuthState authState) {
AuthorizationRequest authRequest = new AuthorizationRequest.Builder(
serviceConfig,
idp.getClientId(),
ResponseTypeValues.CODE,
idp.getRedirectUri())
.setScope(idp.getScope())
.build();
Log.d(TAG, "Making auth request to " + serviceConfig.authorizationEndpoint);
mAuthService.performAuthorizationRequest(
authRequest,
TokenActivity.createPostAuthorizationIntent(
this,
authRequest,
serviceConfig.discoveryDoc,
authState),
mAuthService.createCustomTabsIntentBuilder()
.setToolbarColor(getColorCompat(R.color.colorAccent))
.build());
}
private void makeRegistrationRequest(
@NonNull AuthorizationServiceConfiguration serviceConfig,
@NonNull final IdentityProvider idp) {
final RegistrationRequest registrationRequest = new RegistrationRequest.Builder(
serviceConfig,
Arrays.asList(idp.getRedirectUri()))
.setTokenEndpointAuthenticationMethod(ClientSecretBasic.NAME)
.build();
Log.d(TAG, "Making registration request to " + serviceConfig.registrationEndpoint);
mAuthService.performRegistrationRequest(
registrationRequest,
new AuthorizationService.RegistrationResponseCallback() {
@Override
public void onRegistrationRequestCompleted(
@Nullable RegistrationResponse registrationResponse,
@Nullable AuthorizationException ex) {
Log.d(TAG, "Registration request complete");
if (registrationResponse != null) {
idp.setClientId(registrationResponse.clientId);
Log.d(TAG, "Registration request complete successfully");
// Continue with the authentication
makeAuthRequest(registrationResponse.request.configuration, idp,
new AuthState((registrationResponse)));
}
}
});
}
@TargetApi(Build.VERSION_CODES.M)
@SuppressWarnings("deprecation")
private int getColorCompat(@ColorRes int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return getColor(color);
} else {
return getResources().getColor(color);
}
}
}