This tutorial demonstrates Google Sign-in integrated into WoOF.
As per the Google Sign-in tutorial, Google sign-in is configured as follows.
Note that JQuery has been used. However, any supported web / mobile front-end technology can be used. See the OfficeFloor Subscription App for example (code available here).
<html>
<head>
<!-- Google Sign in -->
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="google-signin-client_id"
content="388391303753-jqugo4vugcf4po6pbenk7879f8er39h2.apps.googleusercontent.com">
<!-- JQuery (but can be any other library) -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
</head>
<body>
<!-- Sign in -->
<div class="g-signin2" data-onsuccess="onSignIn"></div>
<div>
<p id="name"></p>
<img id="profile"></img>
<p id="email"></p>
</div>
<script type="text/javascript">
function onSignIn(googleUser) {
var profile = googleUser.getBasicProfile();
$('#name').text('Hi ' + profile.getName());
$('#profile').attr('src', profile.getImageUrl());
// Send google login token to server
$.ajax({
type : "POST",
url : '/login',
dataType : 'json',
data : JSON.stringify({
googleIdToken : googleUser.getAuthResponse().id_token
}),
contentType : 'application/json',
success : function(result) {
$('#email').text('Server retrieved email: ' + result.email)
}
})
}
</script>
<!-- Sign out -->
<p>
<a href="#" onclick="signOut();">Sign out</a>
</p>
<script>
function signOut() {
gapi.auth2.getAuthInstance().signOut().then(function() {
$('#name').text('');
$('#profile').attr('src', '');
$('#email').text('')
});
}
</script>
</body>
</html>
This will use the Google sign-in features and send the Google Id Token to WoOF to login in the user. This is confirmed by displaying the user's email (sent back from the WoOF server).
Google sign-in is configured in application.objects as follows:
<objects> <managed-object source="net.officefloor.identity.google.GoogleIdTokenVerifierManagedObjectSource"> <property name="google.client.id" value="388391303753-jqugo4vugcf4po6pbenk7879f8er39h2.apps.googleusercontent.com" /> </managed-object> </objects>
This is used by the following service method to verify the user login and send back the email:
public class LoginLogic {
@HttpObject
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class LoginRequest {
private String googleIdToken;
}
@Data
@AllArgsConstructor
public static class LoginResponse {
private String email;
}
public void login(LoginRequest request, GoogleIdTokenVerifier tokenVerifier, ObjectResponse<LoginResponse> response)
throws Exception {
// Verify the token
GoogleIdToken token = tokenVerifier.verify(request.getGoogleIdToken());
// Send email response
response.send(new LoginResponse(token.getPayload().getEmail()));
}
}
To avoid having to call Google with real users, the following unit tests demonstrates creating mock tokens:
@Order(1)
@RegisterExtension
public final GoogleIdTokenExtension googleSignin = new GoogleIdTokenExtension();
@Order(2)
@RegisterExtension
public final MockWoofServerExtension server = new MockWoofServerExtension();
@Test
public void ensureLogin() throws Exception {
// Create mock token
String token = this.googleSignin.getMockIdToken("TEST", "mock@officefloor.net");
// Ensure can login
MockWoofResponse response = this.server
.send(MockWoofServer.mockJsonRequest(HttpMethod.POST, "/login", new LoginRequest(token)));
response.assertJson(200, new LoginResponse("mock@officefloor.net"));
}
JUnit 4 example:
private final GoogleIdTokenRule googleSignin = new GoogleIdTokenRule();
private final MockWoofServerRule server = new MockWoofServerRule();
@Rule
public final RuleChain order = RuleChain.outerRule(this.googleSignin).around(this.server);
@Test
public void ensureLogin() throws Exception {
// Create mock token
String token = this.googleSignin.getMockIdToken("TEST", "mock@officefloor.net");
// Ensure can login
MockWoofResponse response = this.server
.send(MockWoofServer.mockJsonRequest(HttpMethod.POST, "/login", new LoginRequest(token)));
response.assertJson(200, new LoginResponse("mock@officefloor.net"));
}
The next tutorial covers using Google Firestore.