Php Laravel Socialite And Android Google Sign In Operation
24-01-20181. Install Socialite: composer require laravel/socialite
config/services.php
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'), // Your Google Client ID
'client_secret' => env('GOOGLE_CLIENT_SECRET'), // Your Google Client Secret
'redirect' => 'http://www.codesenior.com',
],
And add GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET variables in .env file:
GOOGLE_CLIENT_ID=692373818685-1s057a8mja62g3i7cmj88v2spt3d8b8e.apps.googleusercontent.com GOOGLE_CLIENT_SECRET=c-4CsKAagTYHVyPKbGVcbAsr
3. Create a controller and add login function:
public function login( Request $request ) {
$googleAuthCode = $request->input( 'googleAuthCode' );
$accessTokenResponse= Socialite::driver('google')->getAccessTokenResponse($googleAuthCode);
$accessToken=$accessTokenResponse["access_token"];
$expiresIn=$accessTokenResponse["expires_in"];
$idToken=$accessTokenResponse["id_token"];
$refreshToken=isset($accessTokenResponse["refresh_token"])?$accessTokenResponse["refresh_token"]:"";
$tokenType=$accessTokenResponse["token_type"];
$user = Socialite::driver('google')->userFromToken($accessToken);
}
At Line 1, googleAuthCode parameter comes from Android app:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_google_sign_in);
SignInButton btnSignIn = findViewById(R.id.sign_in_button);
btnSignIn.setSize(SignInButton.SIZE_STANDARD);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestServerAuthCode("692373818685-1s057a8mja62g3i7cmj88v2spt3d8b8e.apps.googleusercontent.com")
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
btnSignIn.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
// Check for existing Google Sign In account, if the user is already signed in
// the GoogleSignInAccount will be non-null.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);
}
private void updateUI(GoogleSignInAccount account) {
if (account != null) {
try {
String email = account.getEmail();
String fullName = account.getDisplayName();
String authCode = account.getServerAuthCode();
authenticate(email, authCode, fullName);
} catch (Exception e) {
if (e.getMessage() != null)
Log.e(TAG, e.getMessage());
Toast.makeText(getApplicationContext(), getString(R.string.unhandled_error), Toast.LENGTH_SHORT).show();
}
}
}
private void authenticate(String email, String googleAuthCode, String fullName) throws IOException {
Retrofit retrofit = ApiClient.getClient(Config.REST_API);
TokenService service = retrofit.create(TokenService.class);
service.getOath(new Token(email, googleAuthCode, fullName)).enqueue(new Callback<TokenResponse>() {
@Override
public void onResponse(Call<TokenResponse> call, Response<TokenResponse> response) {
TokenResponse tokenResponse = response.body();
if (tokenResponse == null) {
Toast.makeText(getApplicationContext(), getString(R.string.unhandled_error), Toast.LENGTH_SHORT).show();
} else {
SharedPreferencesUtil.write(getApplicationContext(), "access_token", tokenResponse.getData());
startActivity(new Intent(GoogleSignActivity.this, MainActivity.class));
finish();
}
}
@Override
public void onFailure(Call<TokenResponse> call, Throwable t) {
Toast.makeText(getApplicationContext(), getString(R.string.unhandled_error), Toast.LENGTH_SHORT).show();
}
});
}
private void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
// The Task returned from this call is always completed, no need to attach
// a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
// Signed in successfully, show authenticated UI.
updateUI(account);
} catch (ApiException e) {
// The ApiException status code indicates the detailed failure reason.
// Please refer to the GoogleSignInStatusCodes class reference for more information.
Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
updateUI(null);
}
}
For more information about Android configuration, read offical documentation: https://developers.google.com/identity/sign-in/android/start-integrating
At line 2. getAccessTokenResponse() function will return access token info without error, but we should add redirect url into Authorised redirect URIs place in Web client (Auto-created for Google Sign-in) API, where you can see in https://console.developers.google.com page.
At Line 8, we access google user detailed information. Please note that, we should enable Google Plus API in https://console.developers.google.com page.