{"id":20294169,"url":"https://github.com/grab/grabplatform-sdk-android","last_synced_at":"2025-09-03T14:35:02.876Z","repository":{"id":57724708,"uuid":"157938313","full_name":"grab/grabplatform-sdk-android","owner":"grab","description":"GrabPlatform SDK for android","archived":false,"fork":false,"pushed_at":"2025-07-08T02:41:24.000Z","size":407,"stargazers_count":24,"open_issues_count":1,"forks_count":9,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-07-14T09:43:06.336Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-11-17T01:07:11.000Z","updated_at":"2025-07-08T02:41:27.000Z","dependencies_parsed_at":"2024-11-14T15:35:40.918Z","dependency_job_id":"f0f83af9-9434-416b-bcd5-a87415cce44e","html_url":"https://github.com/grab/grabplatform-sdk-android","commit_stats":null,"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/grab/grabplatform-sdk-android","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grab%2Fgrabplatform-sdk-android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grab%2Fgrabplatform-sdk-android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grab%2Fgrabplatform-sdk-android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grab%2Fgrabplatform-sdk-android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grab","download_url":"https://codeload.github.com/grab/grabplatform-sdk-android/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grab%2Fgrabplatform-sdk-android/sbom","scorecard":{"id":442976,"data":{"date":"2025-08-11","repo":{"name":"github.com/grab/grabplatform-sdk-android","commit":"5b259c29e2cbb45ec39909b0ccf071066118307a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.6,"checks":[{"name":"Maintained","score":5,"reason":"7 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-19T05:58:29.226Z","repository_id":57724708,"created_at":"2025-08-19T05:58:29.226Z","updated_at":"2025-08-19T05:58:29.226Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273456646,"owners_count":25109104,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-03T02:00:09.631Z","response_time":76,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T15:28:06.826Z","updated_at":"2025-09-03T14:35:02.818Z","avatar_url":"https://github.com/grab.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GrabID Partner SDK - Android\n\nThe GrabId Partner SDK allows users to sign in with their Grab account from third-party apps.\n\nPlease visit [our developer site](https://developers.grab.com) for integration instructions, documentation, support information,\nand terms of service.\n\n## Example\n\nTo run the example project, clone the repo, and run the app in the emulator and walk through the login flow in sequence.\n\n## Requirements\n- API level: minimum API level supported by SDK is 21\n- Android Build Tool 35.0.1\n- Android 35 support\n\n\n## Installation GrabID Partner SDK\n\nAdd dependency in your `build.gradle` file as `implementation 'com.grab.grabidpartnersdk:GrabIdPartnerSDK:x.x.x'`. \n\nFor versions 2.0.9+, GrabID Partner SDK is available in MavenCentral repository.\nFor versions 1.1 - 2.0.6, GrabID Partner SDK is available in JCenter repository.\n\n## Getting Started\n\n### SDK Configuration\nFirst, you need to register an application to Grab and get credentials for your app from GrabID team.\n\nThen, update the AndroidManifest.xml file your project with required information.\nAdd the following snippet, replacing the placeholders within the square brackets (`[]`):\n\n### Setup mandatory parameters in AndroidManifest.xml file as below\n```\n\u003cmeta-dataandroid:name=\"com.grab.partner.sdk.ClientId\" android:value=\"[obtain from GrabId team]\" /\u003e\n\u003cmeta-dataandroid:name=\"com.grab.partner.sdk.RedirectURI\" android:value=\"[Redirect Url must register with Grab Id team during Partner Application registration process]\" /\u003e\n\u003cmeta-dataandroid:name=\"com.grab.partner.sdk.Scope\" android:value=\"[obtain from GrabId team]\" /\u003e\n\u003cmeta-dataandroid:name=\"com.grab.partner.sdk.AcrValues\" android:value=\"[optional parameter: sample value: consent_ctx:countryCode=SG service:PASSENGER, if presence this will add query string parameter \u0026acr_values=\u003cacr value string\u003e in the /authorize api call]\" /\u003e\n\u003cmeta-dataandroid:name=\"com.grab.partner.sdk.Request\" android:value=\"[optional parameter: if presence this will add query string parameter \u0026request=\u003crequest string\u003e in the /authorize api call]\" /\u003e\n\u003cmeta-dataandroid:name=\"com.grab.partner.sdk.LoginHint\" android:value=\"[optional parameter: if presence this will add query string parameter \u0026id_token_hint=\u003clogin hint string\u003e in the /authorize api call]\" /\u003e\n\u003cmeta-dataandroid:name=\"com.grab.partner.sdk.ServiceDiscoveryUrl\" android:value=\"[obtain from GrabId team]\" /\u003e\n```\n\n## Access the GrabId Partner SDK APIs\n\nInitialize GrabIdPartner from the entry point of Partner application, usually inside on the `onCreate` of MainApplication class as below\n```\nGrabIdPartner.instance.initialize(applicationContext, null)\n```\n\n### Login with GrabId service\n\nUse the `loadLoginSession` API to create the LoginSession object using configurations from the `AndroidManifest.xml`. There is another `loadLoginSession` API that can read all the configurations parameters as function parameters, if we use this contract then no need to set the parameters inside `AndroidManifest.xml`. Use the LoginSession object received from `loadLoginSession` API callback, to call the `loginV2` api and complete the login flow, `loginV2` expects an Activity context.\n```\nprivate var loginSession: LoginSession? = null\n    fun clickLogin() {\n        progressBarVisibility.set(View.VISIBLE)\n        stringMessage.set(\"\")\n        GrabIdPartner.instance.loadLoginSession(object : LoginSessionCallback {\n            override fun onSuccess(loginSession: LoginSession) {\n                MainActivityViewModel.loginSession = loginSession\n                GrabIdPartner.instance.loginV2(loginSession, activity, object : LoginCallbackV2 {\n                    // callback implementation\n                })\n            }\n\n            override fun onError(grabIdPartnerError: GrabIdPartnerError) {\n            }\n        })\n    }\n  }\n```\n### Handling URL redirect after user authenticate with Web login\n\nThe login API will trigger the Grab web login flow or native app (Grab passenger app) login flow based on the configuration available in the client_public_info_endpoint in the discovery URL. To setup the native app OAuth flow please visit [our developer site](https://developers.grab.com) and configure your clientId accordingly. After the user successfully authorizes the application, Grab Id service will validate the redirect URL in the query parameter. If the redirect URL is registered with Grab Id service, Grab Id service will perform the redirect the browser back to the application with an authorization code, state, and error (if any) in the redirect query parameters.  \nNote: If we are meant to login with App but package is unavailable then we will attempt to first launch into playstore link if it has been configured and respond via onError for callback with either:\nfailedTolaunchAppStoreLink,     // Failed to launch the configured app store link\nlaunchAppStoreLink // Launch the configured app store link\n\nPlease visit [our developer site](https://developers.grab.com) for integration instructions, documentation, support information,\n\n\nPartner app activity which will listen to the deep link redirect from the Grab ID service, have to set the appropriate `intent-filter` inside partner app `AndroidManifest.xml` file as below\n```\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cactivity android:name=\".views.MainActivity\"\u003e\n  \u003cintent-filter\u003e\n    ...\n  \u003c/intent-filter\u003e\n\u003c/activity\u003e\n```\n\n#### Read the code and state from the redirectUri\n\nPartner application Activity needs to override `onNewIntent` to receive the deep link redirect. After receiving the redirectUrl Partner app can initiate the exchange token flow.\n```\noverride fun onNewIntent(intent: Intent) {\n  super.onNewIntent(intent)\n  var action = intent.action\n  var redirectUrl = intent.dataString\n  if (Intent.ACTION_VIEW == action \u0026\u0026 redirectUrl != null) {\n    // initiate the token exchange with GRAB ID Partner SDK\n  }\n}\n```\n\n### Exchange token with GrabID Partner SDK\nOnce Partner app receive the redirectUrl, then can start the token exchange process using GrabID Partner SDK API `exchangeToken` API.\n```\nGrabIdPartner.instance.exchangeToken(loginSession, redirectUrl, object : ExchangeTokenCallback {\n    // callback implementation\n})\n```\n\n### Get Id Token Information\n\nPartner application can get information about the id token using the `getIdTokenInfo` API:\n\n```\nGrabIdPartner.instance.getIdTokenInfo(loginSession, object : GetIdTokenInfoCallback {\n    // callback implementation\n})\n```\n\nIdToken contains information about the valid time of the token, partner id, partner user id, nonce, issuer, etc\n\n### Check if token is valid\n\n#### Access Token\n\nApplication can use the isValidAccessToken API to check if the access token is valid\n```\nlet isValid = grabIdPartner.isValidAccessToken(loginSession: loginSession)\n```\n#### Id Token\n\nApplication can use the isValidIdToken API to check if the access token is valid\n```\nboolean isValid = grabIdPartner.isValidIdToken(idTokenInfo: IdTokenInfo)\n```\n\n### Logout\n\nPartner application can logout using the logout API. Currently logout removes cached LoginSession and IdTokenInfo from the Android KeyStore and SharedPreferences. It does not support revoking the tokens from Grab Id service. Revoking authorization will be supported in future release.\n\n```\nGrabIdPartner.instance.logout(loginSession, object : LogoutCallback {\n    // callback implementation\n})\n```\n\n### Analytics\nGrabID Partner SDK does not send any analytic data due to user privacy. Third-party is responsible for their own analytics to troubleshoot error and analytics data to address their analytics requirements.\n\n## GrabId Partner SDK API\n\n### LoginSession\n```\nclientId: String              Application registered client id.\n\nredirectUrl: URL              The redirect URL that was used in the initial authorization request.\n                              This URL must register with Grab Id service during Partner registration.\n\nscope: String                 Specify the requested permission scopes.\n\nrequest: String               Partner specific request string.\n\nloginHint: String             Serialized JWT token that client already has, if provided, the user will not be prompted to authenticate\n\nacrValues: [String:String]    Partner specific acr values (name value pairs).\n\n\n\nREAD ONLY PROPERTIES\n\ncode: String?                 Unique authorization code (from query parameter in the redirect url).\n                              This code will be used by the exchangeToken API to obtain the accessToken\n                              and idToken.\n\ncodeVerifier: String?         The code verifier for the PKCE request, that is generated by the login API\n                              before the authorization request.\n\naccessTokenExpiresAt: Date?   Access token expiration date.\n\nstate: String?                The login API generates a unique state parameter during authorization, the\n                              Grab Id service will include the state parameter in the query parameter\n                              in the redirect URL to mitigate CSRF attacks.\n\ntokenType: String?            Indicates the grant type of this token request.\n\nnonce: String?                Unique token generated during login.\n\naccessToken: String?          Access token to make Grab API requests on behalf of the user.\n\nidToken: String?              JWT contains user profile information (Signed).\n\nrefreshToken: String?         Used to obtain/renewed access token (current not supported).\n```\n\n### IdTokenInfo\n\n```\naudience: String?             Intended recipient of the token.\n\nservice: String?              Service (i.e. PASSENGER).\n\nnotValidBefore: Date?         Id token validation start time.\n\nexpiration: Date?             Id token expiration date.\n\nissuer: String?               Issuer (i.e. \"https://idp.grab.com).\n\ntokenId: String?              Id Token (Unsigned).\n\npartnerId: String?            Partner Id.\n\npartnerUserId: String?        Partner User id\n\nnonce: String?                Unique token generated during login. The value should match the\n                              nonce in the LoginSession.\n```\n\n### GrabIdPartnerProtocol\n```\nloadLoginSession(callback: (LoginSession?, GrabIdPartnerError?) -\u003e Unit)\n\nRead the ClientId, Scope, RedirectUrl, Request (optional), AcrValues (optional), IsDebug (optional) from\nthe application's AndroidManifest file and create a LoginSession.\n\nCompletion Handler\nReceives a LoginSession with null error if the information in the AndroidManifest is valid, Otherwise the\ncompletion handler will be called with null LoginSession and a GrabIdPartnerError.\n```\n\n```\nlogin(loginSession: LoginSession, context: Context, callback: (GrabIdPartnerError?) -\u003e Unit)\n\nThe login API will trigger the Grab login flow. If the partner app is configured in client_public_info_endpoint (contained in the discovery URL) to take advantage of native app login state (i.e. PAX, DAX, MEX, etc.). The login API will proxy the authorization request to the native app instead of using default Grab web login flow. Partner can also configure to go to the app store instead of the Grab web login flow. In this case, partner will need to handle error for retry or cancel the Grab login request. To setup the native app OAuth flow please visit our developer site and configure your clientId accordingly. During OAuth flow after the user successfully authorizes the application, Grab Id service will validate the redirect URL in the query parameter with the registered redirect URL, if matches Grab Id service will perform the redirect back to the caller application with an authorization code, state, and error (if any) in the redirect query parameters.\nSDK will give native app as first priority to complete the OAuth flow if native app is configured for the clientId. If native app is not installed in the device and clientId has an appstore_link, then SDK will launch the corresponding app in the Google Play Store for user to install, and will notify the caller application by invoking the callback at onError with either of the following:\n    a. failedTolaunchAppStoreLink,     // Failed to launch the configured app store link\n    b. launchAppStoreLink,             // Launch the configured app store link\nNote: If any client app adds appstore_link configuration but user doesn't install the required native app, the OAuth flow will not be completed.\nFor clients where native app is not installed and no appstore_link is configured then SDK will launch normal web flow to complete the OAuth.\n\nCompletion Handler\nNull if no error, GrabIdPartnerError with error code and message otherwise.\n```\n\n```\nexchangeToken(loginSession: LoginSession, redirectUrl: String, callback: (GrabIdPartnerError?) -\u003e Unit)\n\nThe exchangeToken API is called after Partner app receive the redirect url via deep link after the in-app web authorization. Application should forward the redirect url to the exchangeToken API. The exchangeToken API will check for redirect error, validate the state in the query parameter against the state in the loginSession.  It will send the authorization code to Grab Id token service to get access token, id token, and access token expiration information. The entire API response will be encrypted and will be saved in the.\n\nCompletion Handler\nNull if no error, GrabIdPartnerError with error code and message otherwise.\n\n```\n\n```\nloginCompleted(loginSession: LoginSession) : Boolean\n\nNot implemented yet\n\n```\n\n```\nlogout(loginSession: LoginSession, callback: (GrabIdPartnerError?) -\u003e Unit)\n\nThe logout API will remove cached loginSession and related idTokenInfo.  Calling login after logout or with an expired access token will trigger the in-app web authorization flow. Revoke token support will be added in future release.\n\nCompletion Handler\nNull if no error, GrabIdPartnerError with error code and message otherwise.\n\n```\n\n```\ngetIdTokenInfo(loginSession: LoginSession, callback: (IdTokenInfo?, GrabIdPartnerError?) -\u003e Unit)\n\nApplication can call the getIdTokenInfo API to get the idToken information (i.e. id token expiration date, unsigned Id token, nonce,  audience , partner user id, partner id, etc.). It caches the id token in the SharedPreferences as encrypted text using securedRSA key that will be stored in Android KeyStore. . getIdTokenInfo will return IdTokenInfo from cache if the Id token has not expired. getIdTokenInfo API will return error if the Id Token has expired. Application must call the login API to get a new Id Token before calling getIdTokenInfo API to get the IdTokenInfo/\n\nCompletion Handler\nIf there is no error, idTokenInfo contains id token information, otherwise idTokenInfo will be null\nIf there is error, idTokenInfo will be null and GrabIdPartnerError will contain the error code and message.\n```\n\n```\nisValidAccessToken(loginSession: LoginSession): Boolean\n\nDetermine if the access token in the LoginSession is valid (using the access token expiration date).\n\nReturn\ntrue if the access token is valid, false otherwise\n```\n\n```\nisValidIdToken(idTokenInfo: IdTokenInfo): Boolean\n\nDetermine id token in IdTokenInfo is valid (using the id token start time and expiration date).\n\nReturn\ntrue if the id token is valid, false otherwise\n```\n\n### Grab Id SDK Error\n\n#### GrabIdPartnerError\n```\ngrabIdPartnerErrorDomain: GrabIdPartnerErrorDomain    Error domain\ncode : GrabIdPartnerErrorCode                         Error code\nlocalizeMessage : String?                             Error message\nserviceError : Throwable?                             System Error\n```\n##### GrabIdPartnerErrorCode\n```\nunknown,                        // This error is unexpected or cannot be exposed.\nnetwork,                        // There is an issue with network connectivity.\nsdkNotInitialized,              // SDK is not initialized\ninvalidClientId,                // Invalid client id\nerrorInLoginSessionObject,      // Error in loginSession object\nerrorRetrievingObjectFromSharedPref, // Error retrieving object from shared preferences\ninvalidRedirectURI,             // Invalid redirect uri\ninvalidDiscoveryEndpoint,       // Invalid discovery endpoint\nerrorInDiscoveryEndpoint,       // Error while fetching discovery endpoint\nerrorInExchangeTokenEndpoint,   // Error while fetching discovery endpoint\nmissingAccessToken,             // Access token is missing\nmissingIdToken,                 // Id token is missing\nmissingAccessTokenExpiry,       // Access token expiry is missing\nerrorInGetIdTokenInfo,          // Error in getIdTokenInfo endpoint\ninvalidAuthorizationCode,       // Invalid authorization code\ninvalidAuthorizationUrl,        // The authorize end point is invalid\ninvalidPartnerId,               // Partner id is not set in AndroidManifest.\ninvalidPartnerScope,            // Partner scope is not set in AndroidManifest\nunAuthorized,                   // Partner application is unauthorized.\nserviceUnavailable,             // The service was not available.\ninternalServerError,            // There was an issue with Grab server.\ninvalidAccessToken,             // The access token is invalid.\ninvalidIdToken,                 // The id token is invalid.\ninvalidCode,                    // The code is invalid\nstateMismatch,                  // State received from the redirect url doesn't match with loginSession\ninvalidNonce,                   // The nonce is invalid\ninvalidResponse,                // Unexpected response from GrabId service\nerrorInLogout                   // Error in logout operation\nfailedTolaunchAppStoreLink,     // Failed to launch the configured app store link\nlaunchAppStoreLink,             // Launch the configured app store link\nloginCancelledByUser,           // user cancelled login flow by closing the Chrome tab\n```\n\n## License\n\nMIT License\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrab%2Fgrabplatform-sdk-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrab%2Fgrabplatform-sdk-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrab%2Fgrabplatform-sdk-android/lists"}