Last Updated: 11/9/2022, 8:40:46 AM

# Login IAM Clients

# Quick Reference

References
using AccelByte.Api;
using AccelByte.Core;
using AccelByte.Models;
Login
User user = AccelBytePlugin.GetUser();

user.LoginWithUsername(username, password,
result =>
{
    if (result.IsError)
    {
         Debug.Log("Login failed");
         // some actions
    }
    else
    {
        Debug.Log("Login successful");
         // some actions
    }
});
Check if a Player is Logged In
AccelBytePlugin.GetUser().Session.IsValid();

# Quickstart Guide

In this section, you will learn how to log in and connect to the IAM Services.

  1. Create a script called LoginHandler.cs and add the following AccelByte libraries to the top of the script:
using AccelByte.Api;
using AccelByte.Models;
using AccelByte.Core;
  1. Set up the Login logic using the Username and Password method. In the script, add the following:
// Function called to Login by email to AccelByte's IAM services.
public void OnLoginClick(string username, string password)
{
    // Grab a current User reference, even if it has not logged in yet.
    User user = AccelBytePlugin.GetUser();

    // Call the Login Function and supplying a asynchronous callback to act based upon success or failure
    user.LoginWithUsername(username,password,
        result =>
        {
            if (result.IsError)
            {    
            // Print the Error Code and Message if error happened
                Debug.Log($"Login failed : {result.Error.Code}: {result.Error.Message}");
            }
            else
            {
                Debug.Log("Login successful");
            }
        });
}
  1. Test your script by calling it from elsewhere in MonoBehaviour and supplying sample credentials.
void Start()
{
    OnLoginClick("user@example.net","SuperPassword");
}
  1. Attach your script to a new GameObject. In the example below, we have named this object AccelByteHandler. Test your object by pressing Play. If you have followed these steps correctly, you will see the message Login successfully appear in your Console Log.
  2. Check whether the Player is logged in by checking if their session is valid.
AccelBytePlugin.GetUser().Session.IsValid();

For testing purposes, place this code in the Update function of your script:

void Update()
{
    if (AccelBytePlugin.GetUser().Session.IsValid())
    {
        Debug.Log("Logged in");
    }
}

When you press Play, you should now see that the player is correctly logged in and the stored credentials are valid. Once completed, remove this debug check from your script.

TROUBLESHOOTING

Troubleshooting If you encounter a Login failed message, check your login credentials or the API URLs supplied in the AccelByteSDKConfig.json file. If the error is related to .JSON reading, check the format of your AccelByteSDKConfig.json file.

Congratulations! You have successfully learnt how to log in.

Continue on for a step by step example of the UI and code implementation. Otherwise, you are now ready to move on to the Lobby (opens new window).

# Step by Step Guide

UI Implementation
  1. Create an empty object (such as AccelByteHandler in Step 4 of the Quickstart Guide above) to hold all of the script components of the IAM services implementation.
  2. For the Login Page, create a new panel or scene with the following objects:
  • Username input field
  • Password input field
  • Login button
  • Status text

Authentication

Code Implementation
  1. Add the following code to the top of your LoginHandler.cs class:
using UnityEngine.UI;

Inside the class, add references to the UI components you have just created:

[SerializeField]
Button loginButton;
[SerializeField]
Text statusText;
[SerializeField]
InputField usernameInputField;
[SerializeField]
InputField passwordInputField;
[SerializeField]
RectTransform loginPanel;
  1. In the Start() function, remove the OnLoginClick() call and create two new functions, OnEnable() and OnDisable().
private void OnEnable()
{
    // When we Activate, set the Text of the Login Status
    // and add the Login Call to the Button's listener
    statusText.text = "Please Login";
    loginButton.onClick.AddListener(()
        =>
    {
        statusText.text = "Attempting Login";
        OnLoginClick(usernameInputField.text, passwordInputField.text);
    });
}

private void OnDisable()
{
    // When we disable, clear all of the Listeners from the Login Button
    loginButton.onClick.RemoveAllListeners();
}
  1. Within the OnLoginClick() function, add the following basic login components and status text which will be visible to the player when they are logging in:
public void OnLoginClick(string username, string password)
{
    // Disable Interaction with the Login Button so the player cannot spam click it and send multiple requests
    loginButton.interactable = false;
    statusText.text = "Logging in...";
    ...

    user.LoginWithUsername(username, password,
        result =>
        {
            if (result.IsError)
            {
                // If we error, grab the Error Code and Message to print in the Log
                Debug.Log($"Login failed : {result.Error.Code}: {result.Error.Message}");
        // Set the Status Text to display the Error if there is any
                statusText.text = $"Login failed : {result.Error.Code}: {result.Error.Message}";
            }
            else
            {
                Debug.Log("Login successful");

        // Set the loginPanel to be inactive, (In later tutorials, we'll also use this functionality to display the Lobby/Main Menu)
                loginPanel.gameObject.SetActive(false);
            }

            // Enable interaction with the Button again
            loginButton.interactable = true;
        });
...
  • Set the loginButton to be disabled whilst awaiting the result of the login request (so that the player cannot spam login requests).
  • Set the statusText to display a message (such as Logging in…) to display to the player while the login request is processing.
  • Set the statusText to show the relevant error code and message should the login attempt fail.
  • Set the loginPanel to be disabled if the player logs in successfully.
  • Enable intractability on the loginButton after the login result is determined.
  1. Save and return to the Editor. In the AccelByteHandler gameObject, drag the corresponding objects into the five exposed variables in your LoginHandler.cs script.

Authentication

  1. Save your scene, press Play, and type in your credentials. If your credentials are incorrect, an error message will appear in the log and status text.

Authentication

If your credentials are correct, the scene will become blank as the LoginPanel disappears.

Congratulations! You have now fully implemented the Login, which is the gateway to all other AccelByte services.

Proceed to the next section to learn how to implement Lobby Services (opens new window).

# Full Code

LoginHandler.cs
// Copyright (c) 2021 - 2022 AccelByte Inc. All Rights Reserved.
// This is licensed software from AccelByte Inc, for limitations
// and restrictions contact your company contract manager.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AccelByte.Api;
using AccelByte.Models;
using AccelByte.Core;
using UnityEngine.Serialization;
using UnityEngine.UI;

public class LoginHandler : MonoBehaviour
{
    [SerializeField]
    Button loginButton;
    [SerializeField]
    Text statusText;
    [SerializeField]
    InputField usernameInputField;
    [SerializeField]
    InputField passwordInputField;
    [SerializeField]
    RectTransform loginPanel;

    // Start is called before the first frame update
    void Start()
    {
    }

    private void OnEnable()
    {
        // When we Activate, set the Text of the Login Status
        // and add the Login Call to the Button's listener
        statusText.text = "Please Login";
        loginButton.onClick.AddListener(()
            =>
        {
            statusText.text = "Attempting Login";
            OnLoginClick(usernameInputField.text, passwordInputField.text);
        });
    }

    private void OnDisable()
    {
        // When we disable, clear all of the Listeners from the Login Button
        loginButton.onClick.RemoveAllListeners();
    }

    // Update is called once per frame
    void Update()
    {
        // if (AccelBytePlugin.GetUser().Session.IsValid())
        // {
        //     Debug.Log("Logged in");
        // }
    }

    /// <summary>
    /// Function called to Login to AccelByte's IAM services
    /// </summary>
    /// <param name="username">The Username (typically an email address) of the user</param>
    /// <param name="password">The password of the user</param>
    public void OnLoginClick(string username, string password)
    {
        // Disable Interaction with the Login Button so the player cannot spam click it and send multiple requests
        loginButton.interactable = false;
        statusText.text = "Logging in...";
        // Grab a reference to the current User, even though they have not been logged in yet.
        // This also acts as the initialisation point for the whole AccelByte plugin.
        User user = AccelBytePlugin.GetUser();
        // Calling the Login Function and supplying a callback to act upon based upon success or failure
        // You will almost certainly want to extend this functionality further
        // Note that this callback is asynchronous
        user.LoginWithUsername(username, password,
            result =>
            {
                if (result.IsError)
                {
                    // If we error, grab the Error Code and Message to print in the Log
                    Debug.Log($"Login failed : {result.Error.Code}: {result.Error.Message}");
                    //Set the Status Text to display the Error if there is any
                    statusText.text = $"Login failed : {result.Error.Code}: {result.Error.Message}";
                }
                else
                {
                    Debug.Log("Login successful");

                    loginPanel.gameObject.SetActive(false);
                }

                //Enable interaction with the Button again
                loginButton.interactable = true;
            });
    }    
}