Coder Social home page Coder Social logo

auth0-samples / auth0-android-sample Goto Github PK

View Code? Open in Web Editor NEW
75.0 32.0 136.0 1.27 MB

Auth0 Integration Samples for Android Applications

Home Page: https://auth0.com/docs/quickstart/native/android

License: MIT License

Java 38.95% Kotlin 61.05%
quickstart native android sample dx-sdk-quickstart

auth0-android-sample's Introduction

Auth0 Android Samples

This is the sample code for the Auth0 Android Quickstart using the Auth0 Android SDK.

Please see the sample applications that demonstrate integrating the Auth0 Android SDK into your application:

What is Auth0?

Auth0 helps you to:

  • Add authentication with multiple sources, either social identity providers such as Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce (amongst others), or enterprise identity systems like Windows Azure AD, Google Apps, Active Directory, ADFS, or any SAML Identity Provider.
  • Add authentication through more traditional username/password databases.
  • Add support for linking different user accounts with the same user.
  • Support for generating signed JSON Web Tokens to call your APIs and flow the user identity securely.
  • Analytics of how, when, and where users are logging in.
  • Pull data from other sources and add it to the user profile through JavaScript rules.

Create a Free Auth0 Account

  1. Go to Auth0 and click Sign Up.
  2. Use Google, GitHub, or Microsoft Account to login.

Issue Reporting

If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker. The Responsible Disclosure Program details the procedure for disclosing security issues.

Author

Auth0

License

This project is licensed under the MIT license. See the LICENSE file for more info.

auth0-android-sample's People

Contributors

aaguiarz avatar alexisluque avatar benlizar avatar chenkie avatar dependabot[bot] avatar evansims avatar hzalaz avatar iannyanes avatar jimmyjames avatar joshcanhelp avatar lbalmaceda avatar mehreencs87 avatar ntotten avatar poovamraj avatar tyfrth avatar vmartynets avatar widcket avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

auth0-android-sample's Issues

Sample 07 - Button set out of the screen

Running this project on a 5.5-inch screen with Android 6.0.1 the activity_main.xml place the "App Settings" button out of the screen, this button has marginTop of 100dp wich may cause the problem if the content above has too much height.

image

Steps to reproduce:

  • Download the sample app for authorization.
  • Compile it and run it on Android Studio.
  • Login with a user given the role of admin.

LockActivity: Failed to authenticate the user

Implementing Login/Sign Up using Lock Widget

Getting this error in Logcat:
2020-10-09 20:45:25.928 3473-4954/com.auth0.authoimplementation E/LockActivity: Failed to authenticate the user: An error occurred when trying to authenticate with the server.
com.auth0.android.authentication.AuthenticationException: An error occurred when trying to authenticate with the server.
at com.auth0.android.request.internal.AuthenticationErrorBuilder.from(AuthenticationErrorBuilder.java:29)
at com.auth0.android.request.internal.AuthenticationErrorBuilder.from(AuthenticationErrorBuilder.java:12)
at com.auth0.android.request.internal.BaseRequest.parseUnsuccessfulResponse(BaseRequest.java:139)
at com.auth0.android.request.internal.SimpleRequest.onResponse(SimpleRequest.java:71)
at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:177)
at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)

Hacking tools free

Checklist

  • I have looked into the Readme (Java/Kotlin) and have not found a suitable solution or answer.
  • I have searched the issues and have not found a suitable solution or answer.
  • I have searched the Auth0 Community forums and have not found a suitable solution or answer.
  • I agree to the terms within the Auth0 Code of Conduct.

Description

Bug

Reproduction

Laisin iwbin iwjbsi

Additional context

Gycginm

Sample

Kotlin

Android version(s)

Android

string value in manifestPlaceholders not working

Describe The Problem
Hi, Recently I added Auth0 to my project and after doing everything step by step I got a problem. The problem is while I use my Auth0 domain as string value in manifestPlaceholders, I cannot redirect to the application.
manifestPlaceholders is like below

defaultConfig {
        applicationId "com.amindadgar.myApplicationId"
        minSdkVersion 24
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        // Here my auth0Domain is a string value --> not working
        manifestPlaceholders = [auth0Domain: "@strings/com_auth0_domain", auth0Scheme: "demo"]
    }

How it Works?
After making the auth0Domain hardcoded, The library worked perfectly and I could redirect to my application. ( like below )

defaultConfig {
        applicationId "com.amindadgar.myApplicationId"
        minSdkVersion 24
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        // Here my auth0Domain is Hardcoded --> Working with no problem !!
        manifestPlaceholders = [auth0Domain: "Example-Domain", auth0Scheme: "demo"]
    }

The Question
Why I cannot use string resource in manifestPlaceholders ( Or why it's not working with string value )?

Additional information
The Application builds with no problem and no errors occurred. Just while using string resource as manifestPlaceholders the login page is freezed after filling username and password and pressing the login( or signing in with google account ), Just the loading bar is moving.

Any help would be appreciated

Android SDK with PCKE

Hi There,

In https://auth0.com/docs/flows/concepts/auth-code-pkce it said The easiest way to implement the Authorization Code Flow with PKCE is to follow our Mobile/Native Quickstarts. so I followed this repo but got com.auth0.android.authentication.AuthenticationException: Could not verify the ID token error.

Here is my config:

WebAuthProvider.login(auth0)
    .withScheme("https")
    .withAudience(String.format("https://%s/userinfo", getString(R.string.com_auth0_domain)))
    .start(this, loginCallback);

Thanks

Incorrect Login use case not handled - Sample -01 | Sample-02

In the actual samples the user is able to see the code and the behavior for the use cases in the quickstart. Logout use case is not demonstrated and in some specific cases like:

  • Sample Login
  • Sample Custom login

That would be helpful to better understand the service and how to implement it on Android.

Expected Action:

  • Add the logout buttons to all missing samples
  • Add the logout sample.

Cannot GET /android on specific "facebook" connection

On the WebAuthProvider part if I add .withConnection("facebook") and my chrome browser logs into facebook for the first time, it works fine and redirects to my app but if my browser is already logged into facebook and I try authlogin, the browser does not redirect to the app, It tells Cannot GET/ android.

Android applications targeting SDK 30+ require additional manifest attributes

Google has made changes in the way that applications are allowed to interact with the package manager. They are no longer free to query for any installed packages out of the box when targeting SDK 30+. Additional manifest attributes are required in order to the application to be able to query for an application that can handle the android.intent.action.VIEW intent with scheme https (in other words, withtout these attributes, the auth0 sdk will say that there is no installed browser even when there is).

<manifest>
 <-- ... -->
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="https" />
        </intent>
    </queries>
 <-- ... -->
</manifest>

see https://developer.android.com/preview/privacy/package-visibility for more information

Either the guide needs to be updated, or the combined manifest needs to result in these attributes automatically being applied

Sample 4 - Profile Demo - crashes after login

The Sample app to demo the linking accounts process is crashing after the first login.

Steps to reproduce:

  1. Download the sample app for Profile Demo
  2. Compile it and run it on Android Studio
  3. Login with any of the available IdPs

Expected result: Login works and the Profile Demo sample is shown

Actual result: Application crashes
sample4errorandroid

Unable to sign-in using a google account that has two-factor authentication enabled

This issue is submitted on behalf of the community user

234

Testing the Android sample application (https://auth0.com/docs/quickstart/native/android/00-login) and not able to complete the authorization flow if I sign-in with a Google account that has the two-factor authentication enabled. The CustomTab stays opened forever when it tries to do the last redirect.

I just realized that there is an error in the browser console when this happens.I guess that the browser is blocking the redirect to the custom scheme and that’s the reason why the CustomTab stays opened. Is there anything I can do to avoid this behavior?

1

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

Originally posted by @google-cla in google/omaha#514 (comment)

Cannot GET /android callback issue

I am still getting this issue and I have followed and read all of the documentation references @lbalmaceda referenced in #49 et. al.

I am using 00-login successfully with facebook with the demo scheme, and the demo:// callback url in my approved callbacks.

If I take this working example, and change the scheme to https in the manifest and in the lock builder, then I have the option to choose Browser or Hosted Login Page. I choose browser, and the redirect fails
with the same Cannot GET /android/com.xyx.abc/callback error. I have the approved callback added in the admin as expect, e.g, https://mydomain.auth0.com/android/com.company.project/callback,

The login via the hosted page works, and I would prefer the user didn't have an option unless necessary

Please advise,

TLDR

  1. Use 00-Login example
  2. Replace references to demo scheme with https
  3. add approved callback in admin, https://mydomain.auth0.com/android/com.company.project/callback
  4. choose browser when prompted in android during auth

Android: ability have multiple (or toggle) auth0Domain on manifestPlaceholders at runtime?

Hello,

I am currently following this documentation: Android: Login

My question concerns the build.gradle file for the app.

// —> Add the next line
manifestPlaceholders = [auth0Domain: “@string/com_auth0_domain”, auth0Scheme: “demo”]
// <—

I also see that these values, per documentation:

The placeholders are used internally to define an intent-filter that captures the authentication callback URL.

I have a situation where I must toggle the domain between (or have it from the start to accept) the development and production environments. Auth0 is unable to complete authentication on my Android app because those values are dynamic, and from the documentation the domain is a static value with only one url domain accepted.

The only “solution” I’ve found is to set the host value to use a wildcard (*.mydomain.com), but this does not work too well for my domains and it does not seem to be a safe implementation.

Auth0 Library Import problem

Hey there,
I used the following code in order to add the library inside my android project:
"
implementation ('com.auth0.android:lock:1.14.1')
"
but, when I moved to the mainActivity. it didn't recognize any library objects. I would like to ask what is the reason for the aforementioned problem. I enclosed my build.gradle file to this message.

apply plugin: 'com.android.application'

android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.auth0.samples"
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0"
manifestPlaceholders = [auth0Domain: "@string/com_auth0_domain", auth0Scheme: "demo"]
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation ('com.auth0.android:lock:1.14.1')
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:customtabs:27.1.1'
testImplementation 'junit:junit:4.12'
}

Thank you in advance

Cannot logout from all sessions

Currently, we are using auth0 for authentication for our mobile apps(Android and iOS). We noticed that after a user has performed log out they are not being requested for username/password next time. We followed https://auth0.com/docs/quickstart/native/android/03-session-handling#log-out to implement login and logout. The user logs out of the app, but when he logs back in he is not prompted to enter a username and password. We want them to be able to log out of all sessions. We even tried to use the federated logout option, that did not help either. I can provide further details if needed to help us with this.

string error

auth0-android-sample/00-Login/app/src/main/res/values/strings.xml.example: Error: The file name must end with .xml

Manifest-merge problem during quickstart-setup

  • Got application-keys, added to strings.xml.
  • Added callback url in Auth0 dashboard
  • Added android.permission.INTERNET to Manifest.xml
  • Added Auth0 dep in build.gradle and after that I get an error:
Android resource linking failed
/Users/xx/AndroidStudioProjects/MyAppName/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml:13: error: unexpected element found in .

build.gradle file:

apply plugin: ‘com.android.application’

android {
compileSdkVersion 29
defaultConfig {
applicationId “com.myappname.android”
minSdkVersion 29
targetSdkVersion 29
versionCode 2
versionName “1.0”
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
manifestPlaceholders = [auth0Domain: “@string/com_auth0_domain”, auth0Scheme: “demo”]
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt’), ‘proguard-rules.pro’
}
}
}

dependencies {
implementation fileTree(dir: ‘libs’, include: [’*.jar’])
implementation ‘com.android.support:design:29.1.0’
implementation ‘com.android.support.constraint:constraint-layout:1.1.3’
implementation ‘com.auth0.android:auth0:1.+’
testImplementation ‘junit:junit:4.12’
androidTestImplementation ‘com.android.support.test:runner:1.0.2’
androidTestImplementation ‘com.android.support.test.espresso:espresso-core:3.0.2’
}

Solved by upgrading gradle. Maybe there should be a note added to the quickstart.

Using the embedded Lock screen throws an error on login

Hi,

using the embedded Lock screen, I can't authenticate because of the following error:
"error": { "message": "Grant type 'http://auth0.com/oauth/legacy/grant-type/ro' not allowed for the client.", "oauthError": "unauthorized_client", "type": "oauth-authorization" }

It seems to happen no matter what Grant type I use in the client. (I've enabled the Password grant type).

00-Login app crashes

I'm using the latest version of Android studio and try to get the 00-Login sample app up and running. The app loads, but when I click "SHOW LOG IN", the app crashes. Based on the log output below it seems to not be able to find the auth0 libraries.

I opened the unmodified code from github in Android Studio to run this.

01/15 17:37:46: Launching app
$ adb shell am start -n "com.auth0.samples/com.auth0.samples.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Client not ready yet..Waiting for process to come online
Connected to process 7618 on device emulator-5554
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
I/InstantRun: starting instant run server: is main process
I/zygote: Rejecting re-init on previously-failed class java.lang.Class<com.auth0.samples.MainActivity$2>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/auth0/android/provider/AuthCallback;
I/zygote:     at java.lang.Object java.lang.Class.newInstance() (Class.java:-2)
I/zygote:     at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1174)
I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2669)
I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2856)
I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1589)
I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494)
I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
I/zygote:     at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)
I/zygote: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.auth0.android.provider.AuthCallback" on path: DexPathList[[zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/base.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_0_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_1_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_2_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_3_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_4_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_5_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_6_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_7_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_8_apk.apk", zip
I/zygote:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125)
I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
I/zygote:     at java.lang.Object java.lang.Class.newInstance() (Class.java:-2)
I/zygote:     at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1174)
I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2669)
I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2856)
I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1589)
I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494)
I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
I/zygote:     at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)
I/zygote: Rejecting re-init on previously-failed class java.lang.Class<com.auth0.samples.MainActivity$2>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/auth0/android/provider/AuthCallback;
I/zygote:     at java.lang.Object java.lang.Class.newInstance() (Class.java:-2)
I/zygote:     at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1174)
I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2669)
I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2856)
I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1589)
I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494)
I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
I/zygote:     at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)
I/zygote: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.auth0.android.provider.AuthCallback" on path: DexPathList[[zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/base.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_0_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_1_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_2_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_3_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_4_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_5_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_6_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_7_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_8_apk.apk", zip
I/zygote:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125)
I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
I/zygote:     at java.lang.Object java.lang.Class.newInstance() (Class.java:-2)
I/zygote:     at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1174)
I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2669)
I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2856)
I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1589)
I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494)
I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
I/zygote:     at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)
I/zygote: Rejecting re-init on previously-failed class java.lang.Class<com.auth0.samples.MainActivity$2>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/auth0/android/provider/AuthCallback;
I/zygote:     at java.lang.Object java.lang.Class.newInstance() (Class.java:-2)
I/zygote:     at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1174)
I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2669)
I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2856)
I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1589)
I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494)
I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
I/zygote:     at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)
I/zygote: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.auth0.android.provider.AuthCallback" on path: DexPathList[[zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/base.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_0_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_1_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_2_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_3_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_4_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_5_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_6_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_7_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_8_apk.apk", zip
I/zygote:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125)
I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
I/zygote:     at java.lang.Object java.lang.Class.newInstance() (Class.java:-2)
I/zygote:     at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1174)
I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2669)
I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2856)
I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1589)
I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106)
I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494)
I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
I/zygote:     at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438)
I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)
D/OpenGLRenderer: HWUI GL Pipeline
I/zygote: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 1
W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
D/OpenGLRenderer: Swap behavior 0
D/EGL_emulation: eglCreateContext: 0x9c0fcd80: maj 2 min 0 rcv 2
D/EGL_emulation: eglMakeCurrent: 0x9c0fcd80: ver 2 0 (tinfo 0x9d363d40)
D/EGL_emulation: eglMakeCurrent: 0x9c0fcd80: ver 2 0 (tinfo 0x9d363d40)
V/StudioProfiler: StudioProfilers agent attached.
V/StudioProfiler: Acquiring Application for Events
V/StudioProfiler: Transformed class: java/net/URL
W/zygote: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
V/StudioProfiler: Memory control stream started.
V/StudioProfiler: Live memory tracking disabled.
V/StudioProfiler: Live memory tracking enabled.
V/StudioProfiler: JNIEnv not attached
V/StudioProfiler: Loaded classes: 5089
V/StudioProfiler: Tracking initialization took: 542442210ns
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.auth0.samples, PID: 7618
                  java.lang.NoClassDefFoundError: Failed resolution of: Lcom/auth0/android/Auth0;
                      at com.auth0.samples.MainActivity.login(MainActivity.java:43)
                      at com.auth0.samples.MainActivity.access$000(MainActivity.java:23)
                      at com.auth0.samples.MainActivity$1.onClick(MainActivity.java:36)
                      at android.view.View.performClick(View.java:6294)
                      at android.view.View$PerformClick.run(View.java:24770)
                      at android.os.Handler.handleCallback(Handler.java:790)
                      at android.os.Handler.dispatchMessage(Handler.java:99)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6494)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                   Caused by: java.lang.ClassNotFoundException: Didn't find class "com.auth0.android.Auth0" on path: DexPathList[[zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/base.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_0_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_1_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_2_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_3_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_4_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_5_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_6_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_7_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_8_apk.apk", zip file "/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.auth0.samples-4zZI_g2IWVjQbxKC_KhNew==/lib/x86, /system/lib, /vendor/lib]]
                      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
                      at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
                      at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
                      at com.auth0.samples.MainActivity.login(MainActivity.java:43) 
                      at com.auth0.samples.MainActivity.access$000(MainActivity.java:23) 
                      at com.auth0.samples.MainActivity$1.onClick(MainActivity.java:36) 
                      at android.view.View.performClick(View.java:6294) 
                      at android.view.View$PerformClick.run(View.java:24770) 
                      at android.os.Handler.handleCallback(Handler.java:790) 
                      at android.os.Handler.dispatchMessage(Handler.java:99) 
                      at android.os.Looper.loop(Looper.java:164) 
                      at android.app.ActivityThread.main(ActivityThread.java:6494) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
Application terminated.

Missing Instructions on Sample Projects

For a user to be able to run the sample projects successfully the package name must be added to the allowed urls list. For example:

https://tutorials.auth0.com/android/com.auth0.logindemo/callback ---> For sample login
https://tutorials.auth0.com/android/com.auth0.customlogindemo/callback ---> For custom login https://tutorials.auth0.com/android/com.auth0.sessiondemo/callback ---> For session demo https://tutorials.auth0.com/android/com.auth0.profiledemo/callback ---> For profile demo https://tutorials.auth0.com/android/com.auth0.linkingaccountsdemo/callback ---> For sample login for the linking accounts demo

This is specified neither in the project's readme file nor in the quickstart.

And the result is that the projects compile and run but return a callback error at the end.

Suggested solution:

  • Add the instruction in the readme file or in the quickstart

Implementing feature for socket.io

Hi, I'm using socket.io and i want to implementing refresh token for my apps, after read this link :

https://github.com/auth0/socketio-jwt

i found this site as Auth0, not i'm reading this android sample but i dont know how can i implementing this feature on android and use that,

this is my nodejs sample code:

function start(port) {
    io.on('connection',
          socketioJwt.authorize(
              {
                  secret : Buffer(JSON.stringify(process.env.AUTH0_CLIENT_SECRET), 'base64'),
                  timeout: 15000 // 15 seconds to send the authentication message
              }))
        .on('authenticated', function (socket) {
            console.log('connected & authenticated: ' + JSON.stringify(socket.decoded_token));
            socket.on('new message', function (data) {
                socket.broadcast.emit('new message', "hey !!");
            });

my users login with socket.io and after successful login how can i get token and refresh that each request?

this below code is your sample code, please help me how can i implementing that
Thanks

public class LockActivity extends Activity {
    private Lock mLock;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Auth0 auth0 = new Auth0(getString(R.string.auth0_client_id), getString(R.string.auth0_domain));
        this.mLock = Lock.newBuilder(auth0, mCallback)
                //Add parameters to the build
                .build();
        mLock.onCreate(this);
        startActivity(this.mLock.newIntent(this));
    }
    private final LockCallback mCallback = new AuthenticationCallback() {
        @Override
        public void onAuthentication(Credentials credentials) {
            Toast.makeText(getApplicationContext(), "Log In - Success", Toast.LENGTH_SHORT).show();
            App.getInstance().setUserCredentials(credentials);
            startActivity(new Intent(getApplicationContext(), MainActivity.class));
        }
        @Override
        public void onCanceled() {
        }

        @Override
        public void onError(LockException error) {
        }
    };
}

Error while using User-Profile Sample

I used the sample for User-Profile
I am getting following errors when i login successfully:
{"statusCode":400,"error":"Bad Request","message":"Bad HTTP authentication header format","errorCode":"Bearer"}
com.auth0.android.management.ManagementException: An error occurred when trying to authenticate with the server.

Can you please help on this?

Build fails with auth0 >= 1.26.0

Changing the dependency to 1.25.0 fixes the issue.

Error message:

Android resource linking failed
/home/sproctor/.gradle/caches/transforms-2/files-2.1/8445f4d4e2814af28d053d2f94216b45/auth0-1.26.0/AndroidManifest.xml:39:5-47:15: AAPT: error: unexpected element <queries> found in <manifest>.

Logout button in all Android sample projects needed

Context:

  • Android sample projects are downloaded
  • Whichever sample is running in the Android emulator
  • The user/tester logs in or signs in
  • The sample program remembers the credentials, so the next time it is opened, the program doesn't ask the user/tester again for any credentials

Problem:

  • There is no way out.

Request:

  • Add a logout button to every Android sample project, because it is more useful to test if it stops recognizing the same credentials, so the user/tester can whether sign in or log in again with other credentials when is needed.

TIP: you can duplicate the problem by running an Android sample project in the emulator and entering any credentials.

Logout button wrong tag

On the "user profile" sample, the logout button's currently tagged as "Login again" instead of logout:
image

Gradle not building the project on Android

Description
On Android studio, gradle is not building the project, not finding the resources.

Solution
The minimum SDK and the SDK compiler is not compatible with the new android studio, and play store is requiring that all apps have a min SDK version of 26.

image

OAuthManager: Received state doesn't match.

I get this unindentified error, couldn't debug where's the problem. Even clear app data doesn't work.

E/OAuthManager: Received state doesn't match. Received VikZhSyOD0MBxkiPG7swzaQsc2yAuM6s2Y3jn_m3yfU but expected On7vaXLWhWslEoh8ly0e9eFxhboZktfjyh_MXk3nULo
W/System.err: com.auth0.android.authentication.AuthenticationException: An error occurred when trying to authenticate with the server.
W/System.err:     at com.auth0.android.provider.OAuthManager.assertValidState(OAuthManager.java:187)
W/System.err:     at com.auth0.android.provider.OAuthManager.resumeAuthorization(OAuthManager.java:120)
W/System.err:     at com.auth0.android.provider.WebAuthProvider.resume(WebAuthProvider.java:389)
W/System.err:     at com.auth0.android.provider.AuthenticationActivity.deliverSuccessfulAuthenticationResult(AuthenticationActivity.java:126)
W/System.err:     at com.auth0.android.provider.AuthenticationActivity.onResume(AuthenticationActivity.java:85)
W/System.err:     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1413)
W/System.err:     at android.app.Activity.performResume(Activity.java:7366)
W/System.err:     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3816)
W/System.err:     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3856)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err:     at android.os.Looper.loop(Looper.java:201)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6806)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

This is how I initialize...

WebAuthProvider
                .init(auth)
                .withScheme("xxx")
                .withAudience("https://${getString(R.string.com_auth0_domain)}/userinfo")
                .start(this, object : AuthCallback {
                    override fun onSuccess(credentials: Credentials) {

                        if (!credentials.accessToken.isNullOrEmpty())
                            AppUser(this@SplashActivity)
                                .setAccessToken(credentials.accessToken!!)
                                .save(this@SplashActivity)

                        if (!credentials.idToken.isNullOrEmpty())
                            AppUser(this@SplashActivity)
                                .setIdToken(credentials.idToken!!)
                                .save(this@SplashActivity)

                        startActivity(Intent(this@SplashActivity, MainActivity::class.java))

                    }

                    override fun onFailure(dialog: Dialog) {
                        dialog.show()
                    }

                    override fun onFailure(exception: AuthenticationException?) {
                        exception?.printStackTrace()
                    }
                })

Error loading discovery document: Error connecting to https://xxx.auth0.com/.well-known/openid-configuration. The SSL connection could not be established, see inner exception..

We I click login on the Android sample an System.InvalidOperationException is being thrown with the message Error loading discovery document: Error connecting to https://xxx.auth0.com/.well-known/openid-configuration. The SSL connection could not be established, see inner exception..

Googling around revealed that this is an issue related to Let's Encrypt Certificates. I cannot resolve this issue myself as it is happening in the Auth0.OidcClient library.

Inner exception
Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/boringssl/ssl/handshake_client.c:1132

Stack Trace
at IdentityModel.OidcClient.OidcClient.EnsureProviderInformationAsync (System.Threading.CancellationToken cancellationToken) [0x00155] in /_/src/OidcClient/OidcClient.cs:410 at IdentityModel.OidcClient.OidcClient.EnsureConfigurationAsync (System.Threading.CancellationToken cancellationToken) [0x00023] in /_/src/OidcClient/OidcClient.cs:374 at IdentityModel.OidcClient.OidcClient.LoginAsync (IdentityModel.OidcClient.LoginRequest request, System.Threading.CancellationToken cancellationToken) [0x00070] in /_/src/OidcClient/OidcClient.cs:73 at Auth0.OidcClient.Auth0ClientBase.LoginAsync (System.Object extraParameters, System.Threading.CancellationToken cancellationToken) [0x000f8] in <34f276a24a504fc099620fe62e28d814>:0 at AndroidSample.MainActivity.LoginButtonOnClick (System.Object sender, System.EventArgs eventArgs) [0x00095] in C:\dev\sandbox\auth0-xamarin-oidc-samples\Quickstart\01-Login\Android\AndroidSample\MainActivity.cs:74

Conflict with existing Okhttp dependency

I'm attempting to implement the Auth0 SSO on an existing project that uses Retrofit 1.8/Okhttp 2.0.0. Once I added the Auth0 dependency to my gradle file, the existing calls throughout the application began to fail with the error "method POST must have a request body".
We use a custom GET interface that allows us to have a body in the request and it works fine without the Auth0 SDK included.

The implementation of the call is
@GET(NetworkingConstants.API_LOGIN) Result<LoginResponse> login(@Body LoginRequest request);

Is it possible that the version of Okhttp that the Auth0 SDK uses conflicts with and breaks the version currently used in the project? If so, how can I fix the issue?

Sample 5 - Linking Accounts - Callback error

The Sample 5 on Linking Accounts is resulting in a callback error even though the package name is registered as an allowed callback url.

Steps to reproduce:

  1. Download sample 5 - Linking Accounts
  2. Register the following url on the allowed callbacks url: https://tutorials.auth0.com/android/com.auth0.linkingaccountsdemo/callback
  3. Compile and run de App.
  4. Login with any of the available IdPs

Expected result: After login, the linking accounts activity is shown.

Actual Result: Callback error.

Could you provide a sample that uses App Links?

I have added the library to my app but it does not work with Firefox. Compared to sample app the only thing that is different is com_auth0_schema.

So just as the title says, add a sample that has https as scheme, at least for me, it would help understand why Firefox does not work but Chrome, Vivaldi, Edge etc all work fine.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.