diff --git a/.gitignore b/.gitignore
index 526b8c5..7355877 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,393 @@
-.DS_Store
-.dart_tool/
+# File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig
+
+# Created by https://www.gitignore.io/api/android,dart,flutter,macos,visualstudiocode,xcode,jetbrains,swift,swiftpackagemanager
+# Edit at https://www.gitignore.io/?templates=android,dart,flutter,macos,visualstudiocode,xcode,jetbrains,swift,swiftpackagemanager
+
+### Android ###
+# Built application files
+*.apk
+*.ap_
+*.aab
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+release/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+*.iml
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+# Android Studio 3 in .gitignore file.
+.idea/caches
+.idea/modules.xml
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
+.idea/navEditor.xml
+
+# Keystore files
+# Uncomment the following lines if you do not want to check your keystore files in.
+#*.jks
+#*.keystore
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+
+# Google Services (e.g. APIs or Firebase)
+# google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
+fastlane/test_output
+fastlane/readme.md
+
+# Version control
+vcs.xml
+# lint
+lint/intermediates/
+lint/generated/
+lint/outputs/
+lint/tmp/
+# lint/reports/
+
+### Android Patch ###
+gen-external-apklibs
+output.json
+
+### Dart ###
+# See https://www.dartlang.org/guides/libraries/private-files
+
+# Files and directories created by pub
+.dart_tool/
.packages
+# If you're building an application, you may want to check-in your pubspec.lock
+pubspec.lock
+
+# Directory created by dartdoc
+# If you don't generate documentation locally you can remove this line.
+doc/api/
+
+# Avoid committing generated Javascript files:
+*.dart.js
+*.info.json # Produced by the --dump-info flag.
+*.js # When generated by dart2js. Don't specify *.js if your
+ # project includes source files written in JavaScript.
+*.js_
+*.js.deps
+*.js.map
+
+### Flutter ###
+# Flutter/Dart/Pub related
+**/doc/api/
+.flutter-plugins
+.pub-cache/
.pub/
-.idea
-build/
-ios/.generated/
-ios/Flutter/Generated.xcconfig
-ios/Runner/GeneratedPluginRegistrant.*
+# Android related
+**/android/**/gradle-wrapper.jar
+**/android/.gradle
+**/android/captures/
+**/android/gradlew
+**/android/gradlew.bat
+**/android/local.properties
+**/android/**/GeneratedPluginRegistrant.java
+
+# iOS/XCode related
+**/ios/**/*.mode1v3
+**/ios/**/*.mode2v3
+**/ios/**/*.moved-aside
+**/ios/**/*.pbxuser
+**/ios/**/*.perspectivev3
+**/ios/**/*sync/
+**/ios/**/.sconsign.dblite
+**/ios/**/.tags*
+**/ios/**/.vagrant/
+**/ios/**/DerivedData/
+**/ios/**/Icon?
+**/ios/**/Pods/
+**/ios/**/.symlinks/
+**/ios/**/profile
+**/ios/**/xcuserdata
+**/ios/.generated/
+**/ios/Flutter/App.framework
+**/ios/Flutter/Flutter.framework
+**/ios/Flutter/Generated.xcconfig
+**/ios/Flutter/app.flx
+**/ios/Flutter/app.zip
+**/ios/Flutter/flutter_assets/
+**/ios/ServiceDefinitions.json
+**/ios/Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!**/ios/**/default.mode1v3
+!**/ios/**/default.mode2v3
+!**/ios/**/default.pbxuser
+!**/ios/**/default.perspectivev3
+!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+
+### JetBrains ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### JetBrains Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+.idea/sonarlint
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### Swift ###
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## Build generated
+DerivedData/
+
+## Various settings
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata/
+
+## Other
+*.moved-aside
+*.xccheckout
+*.xcscmblueprint
+
+## Obj-C/Swift specific
+*.hmap
+*.ipa
+*.dSYM.zip
+*.dSYM
+
+## Playgrounds
+timeline.xctimeline
+playground.xcworkspace
+
+# Swift Package Manager
+# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
+# Packages/
+# Package.pins
+# Package.resolved
+.build/
+
+# CocoaPods
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+# Pods/
+# Add this line if you want to avoid checking in source code from the Xcode workspace
+# *.xcworkspace
+
+# Carthage
+# Add this line if you want to avoid checking in source code from Carthage dependencies.
+# Carthage/Checkouts
+
+Carthage/Build
+
+# Accio dependency management
+Dependencies/
+.accio/
+
+# fastlane
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
+# screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/#source-control
+
+fastlane/screenshots/**/*.png
+
+# Code Injection
+# After new code Injection tools there's a generated folder /iOSInjectionProject
+# https://github.com/johnno1962/injectionforxcode
+
+iOSInjectionProject/
+
+### SwiftPackageManager ###
+Packages
+xcuserdata
+*.xcodeproj
+
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+
+### Xcode ###
+# Xcode
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## User settings
+
+## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
+
+## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
+
+## Xcode Patch
+*.xcodeproj/*
+!*.xcodeproj/project.pbxproj
+!*.xcodeproj/xcshareddata/
+!*.xcworkspace/contents.xcworkspacedata
+/*.gcno
+
+### Xcode Patch ###
+**/xcshareddata/WorkspaceSettings.xcsettings
+
+# End of https://www.gitignore.io/api/android,dart,flutter,macos,visualstudiocode,xcode,jetbrains,swift,swiftpackagemanager
+
+# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
+.vscode/launch.json
-# example
-example/build
+scripts/pub_publish.sh
+.idea/
+.flutter-plugins-dependencies
+.gradle/
+local.properties
+.flutter-plugins
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ae52c71..af28084 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,37 +1,63 @@
-## v0.0.1 (2018-10-31)
+## v0.5.0 (2019-08-09)
-A Flutter plugin to use the [Auth0 API](https://auth0.com/docs/api/authentication).
+breaking changes:
-Note: This plugin is still under development, and some APIs might not be available yet. Feedback and Pull Requests are most welcome!
+- parameter to use auth0 authentication
-## Usage
-To use this plugin, add `flutter_auth0` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/).
+features:
-## SignIn with email and password
+- users handler
+ - get user info
+ - update user info
-To signin instance auth0 using `auth0-client-id` and `auth0-domain` and call signInWithEmailAndPassword function with email and password as params
+## v0.3.1 (2019-08-09)
-```dart
+fixes:
-final auth = new Auth0(clientId: 'your-client-id', domain: 'your-domain');
+- pub.dev fixes
-Auth0User user = await auth.passwordRealm(
- username: 'username/email',
- password: 'password',
- realm: 'Username-Password-Authentication');
-```
+## v0.3.0 (2019-08-09)
+
+fixes:
+
+- blank login page
-## Example
+## v0.2.2 (2019-08-08)
-See the [example application](https://github.com/devdennysegura/flutter-auth0/tree/master/example) source
-for a complete sample app using the auth0 authentication.
+fixes:
+
+- minor fixes
+
+## v0.2.1 (2019-01-31)
+
+fixes:
+
+- Expiration token in seconds.
+
+## v0.2.0 (2019-01-30)
+
+enhances:
+
+- Error handler when sign-in/sign-up.
+
+## v0.1.0 (2019-01-10)
+
+features:
+
+- Refresh token integrated.
+
+enhances:
+
+- directory layout was change.
## v0.0.2 (2018-12-03)
### Using Authorization Code flow with PKCE
+

### Callback URL(s)
+
Callback URLs are the URLs that Auth0 invokes after the authentication process. Auth0 routes your application back to this URL and appends additional parameters to it, including a token. Since callback URLs can be manipulated, you will need to add this URL to your Application's Allowed Callback URLs for security. This will enable Auth0 to recognize these URLs as valid. If omitted, authentication will not be successful.
Go to the [Auth0 Dashboard](https://manage.auth0.com/#/applications), select your application and make sure that **Allowed Callback URLs** contains the following:
@@ -49,11 +75,12 @@ Go to the [Auth0 Dashboard](https://manage.auth0.com/#/applications), select you
```
### To use
+
#### Android
In the file `android/app/src/main/AndroidManifest.xml` you must make sure the **MainActivity** of the app has a **launchMode** value of `singleTask` and add the following activity:
-So if you have `samples.auth0.com` as your Auth0 domain you would have the following **MainActivity** configuration:
+So if you have `samples.auth0.com` as your Auth0 domain you would have the following **MainActivity** configuration:

@@ -62,11 +89,11 @@ Create the file **RedirectUriReceiver.java**

#### iOS
+
Inside the ios folder find the file AppDelegate.[swift|m] add the following to it

-
Inside the `ios` folder open the `Info.plist` and locate the value for `CFBundleIdentifier`, e.g.
```xml
@@ -92,10 +119,26 @@ and then register a URL type entry using the value of `CFBundleIdentifier` as th
```
-## v0.1.0 (2019-01-10)
+## v0.0.1 (2018-10-31)
-features:
-- Refresh token integrated.
+A Flutter plugin to use the [Auth0 API](https://auth0.com/docs/api/authentication).
-enhances:
-- directory layout was change.
\ No newline at end of file
+Note: This plugin is still under development, and some APIs might not be available yet. Feedback and Pull Requests are most welcome!
+
+## Usage
+
+To use this plugin, add `flutter_auth0` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/).
+
+## SignIn with email and password
+
+To signin instance auth0 using `auth0-client-id` and `auth0-domain` and call signInWithEmailAndPassword function with email and password as params
+
+```dart
+
+final auth = new Auth0(clientId: 'your-client-id', domain: 'your-domain');
+
+Auth0User user = await auth.passwordRealm(
+ username: 'username/email',
+ password: 'password',
+ realm: 'Username-Password-Authentication');
+```
diff --git a/README.md b/README.md
index 76ff710..cc5be43 100644
--- a/README.md
+++ b/README.md
@@ -5,85 +5,13 @@ A Flutter plugin to use the [Auth0 API & Auth0 PKCE flow](https://auth0.com/docs
Note: This plugin is still under development, and some APIs might not be available yet. Feedback and Pull Requests are most welcome!
-## Authentication API
-### Usage
-To use this plugin, add `flutter_auth0` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/).
-
-## SignIn with email and password
-
-To signin instance auth0 using `auth0-client-id` and `auth0-domain` and call signInWithEmailAndPassword function with email and password as params
-
-
-
-### Using Authorization Code flow with PKCE
-
-
-### Callback URL(s)
-Callback URLs are the URLs that Auth0 invokes after the authentication process. Auth0 routes your application back to this URL and appends additional parameters to it, including a token. Since callback URLs can be manipulated, you will need to add this URL to your Application's Allowed Callback URLs for security. This will enable Auth0 to recognize these URLs as valid. If omitted, authentication will not be successful.
-
-Go to the [Auth0 Dashboard](https://manage.auth0.com/#/applications), select your application and make sure that **Allowed Callback URLs** contains the following:
-
-#### iOS
-
-```text
-{YOUR_BUNDLE_IDENTIFIER}://${YOUR_AUTH0_DOMAIN}/ios/{YOUR_BUNDLE_IDENTIFIER}/callback
-```
-
-#### Android
-
-```text
-{YOUR_APP_PACKAGE_NAME}://{YOUR_AUTH0_DOMAIN}/android/{YOUR_APP_PACKAGE_NAME}/callback
-```
-
-### To use
-#### Android
-
-In the file `android/app/src/main/AndroidManifest.xml` you must make sure the **MainActivity** of the app has a **launchMode** value of `singleTask` and add the following activity:
-
-So if you have `samples.auth0.com` as your Auth0 domain you would have the following **MainActivity** configuration:
-
-
-
-Create the file **RedirectUriReceiver.java**
-
-
-
-#### iOS
-Inside the ios folder find the file AppDelegate.[swift|m] add the following to it
-
-
-
-
-Inside the `ios` folder open the `Info.plist` and locate the value for `CFBundleIdentifier`, e.g.
-
-```xml
-CFBundleIdentifier
-$(PRODUCT_BUNDLE_IDENTIFIER)
-```
-
-and then register a URL type entry using the value of `CFBundleIdentifier` as the value of `CFBundleURLSchemes`
-
-```xml
-CFBundleURLTypes
-
-
- CFBundleTypeRole
- None
- CFBundleURLName
- auth0
- CFBundleURLSchemes
-
- $(PRODUCT_BUNDLE_IDENTIFIER)
-
-
-
-```
-
## Example
See the [example application](https://github.com/devdennysegura/flutter-auth0/tree/master/example) source
@@ -93,12 +21,12 @@ for a complete sample app using the auth0 authentication.
Auth0 helps you to:
-* Add authentication with [multiple authentication sources](https://docs.auth0.com/identityproviders), either social like **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, amont 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](https://docs.auth0.com/mysql-connection-tutorial)**.
-* Add support for **[linking different user accounts](https://docs.auth0.com/link-accounts)** with the same user.
-* Support for generating signed [Json Web Tokens](https://docs.auth0.com/jwt) 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](https://docs.auth0.com/rules).
+- Add authentication with [multiple authentication sources](https://docs.auth0.com/identityproviders), either social like **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, amont 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](https://docs.auth0.com/mysql-connection-tutorial)**.
+- Add support for **[linking different user accounts](https://docs.auth0.com/link-accounts)** with the same user.
+- Support for generating signed [Json Web Tokens](https://docs.auth0.com/jwt) 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](https://docs.auth0.com/rules).
## Create a free Auth0 Account
@@ -113,4 +41,4 @@ This readme based on [react-native-auth0](https://github.com/auth0/react-native-
## License
-This project is licensed under the MIT license. See the [LICENSE](LICENSE.txt) file for more info.
\ No newline at end of file
+This project is licensed under the MIT license. See the [LICENSE](LICENSE.txt) file for more info.
diff --git a/android/.classpath b/android/.classpath
index eb19361..32d6691 100644
--- a/android/.classpath
+++ b/android/.classpath
@@ -1,6 +1,6 @@
-
+
diff --git a/android/.gradle/4.10.2/fileChanges/last-build.bin b/android/.gradle/4.10.2/fileChanges/last-build.bin
deleted file mode 100644
index f76dd23..0000000
Binary files a/android/.gradle/4.10.2/fileChanges/last-build.bin and /dev/null differ
diff --git a/android/.gradle/4.10.2/fileHashes/fileHashes.bin b/android/.gradle/4.10.2/fileHashes/fileHashes.bin
deleted file mode 100644
index 0753e2b..0000000
Binary files a/android/.gradle/4.10.2/fileHashes/fileHashes.bin and /dev/null differ
diff --git a/android/.gradle/4.10.2/fileHashes/fileHashes.lock b/android/.gradle/4.10.2/fileHashes/fileHashes.lock
deleted file mode 100644
index 7661d63..0000000
Binary files a/android/.gradle/4.10.2/fileHashes/fileHashes.lock and /dev/null differ
diff --git a/android/.gradle/4.10.2/gc.properties b/android/.gradle/4.10.2/gc.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/android/.settings/org.eclipse.buildship.core.prefs b/android/.settings/org.eclipse.buildship.core.prefs
index e889521..9c7f4af 100644
--- a/android/.settings/org.eclipse.buildship.core.prefs
+++ b/android/.settings/org.eclipse.buildship.core.prefs
@@ -1,2 +1,13 @@
-connection.project.dir=
+arguments=
+auto.sync=false
+build.scans.enabled=false
+connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(5.4))
+connection.project.dir=../example/android
eclipse.preferences.version=1
+gradle.user.home=
+java.home=
+jvm.arguments=
+offline.mode=false
+override.workspace.settings=true
+show.console.view=true
+show.executions.view=true
diff --git a/android/.settings/org.eclipse.jdt.core.prefs b/android/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..c51875c
--- /dev/null
+++ b/android/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=12
+org.eclipse.jdt.core.compiler.compliance=12
+org.eclipse.jdt.core.compiler.source=12
diff --git a/android/build.gradle b/android/build.gradle
index fc16cea..9a72bcb 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -8,7 +8,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.2.1'
+ classpath 'com.android.tools.build:gradle:3.4.1'
}
}
@@ -22,17 +22,16 @@ rootProject.allprojects {
apply plugin: 'com.android.library'
android {
- compileSdkVersion 27
+ compileSdkVersion 28
defaultConfig {
minSdkVersion 16
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
lintOptions {
disable 'InvalidPackage'
}
dependencies{
- implementation "com.android.support:support-core-utils:27.1.1"
- implementation 'com.android.support:customtabs:26.1.0'
- }
+ implementation 'androidx.legacy:legacy-support-core-utils:1.0.0'
+ implementation 'androidx.browser:browser:1.0.0' }
}
\ No newline at end of file
diff --git a/android/gradle.properties b/android/gradle.properties
index f98a4cc..7be3d8b 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1 +1,2 @@
-org.gradle.jvmargs=-Xmx1536M
\ No newline at end of file
+org.gradle.jvmargs=-Xmx1536M
+android.enableR8=true
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index d6bf908..8445b8d 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
\ No newline at end of file
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
\ No newline at end of file
diff --git a/android/local.properties b/android/local.properties
deleted file mode 100644
index 5358e5e..0000000
--- a/android/local.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-sdk.dir=/Users/tangdev/Library/Android/sdk
-flutter.sdk=/Users/tangdev/development/flutter
-flutter.versionName=0.0.1
\ No newline at end of file
diff --git a/android/src/main/java/io/flutter/plugins/flutterauth0/AuthenticationReceiver.java b/android/src/main/java/io/flutter/plugins/flutterauth0/AuthenticationReceiver.java
new file mode 100644
index 0000000..46a7fb1
--- /dev/null
+++ b/android/src/main/java/io/flutter/plugins/flutterauth0/AuthenticationReceiver.java
@@ -0,0 +1,41 @@
+package io.flutter.plugins.flutterauth0;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+import io.flutter.plugins.flutterauth0.FlutterAuth0Plugin;
+
+public class AuthenticationReceiver extends Activity {
+ private static final String TAG = AuthenticationReceiver.class.getName();
+
+ public static final String EXTRA_CODE = "Auth0Code";
+ public static final String EXTRA_ERROR = "Auth0Error";
+
+ public void onCreate(Bundle savedInstanceBundle) {
+ super.onCreate(savedInstanceBundle);
+ Intent intent = this.getIntent();
+ Uri uri = intent.getData();
+ String access_token = uri.getQueryParameter("code");
+ String error = uri.getQueryParameter("error");
+ closeView(access_token, error);
+ }
+
+ private void closeView(String token, String errorMessage) {
+ Intent intent = new Intent(AuthenticationReceiver.this, FlutterAuth0Plugin.getActivity().getClass());
+ intent.putExtra(EXTRA_CODE, token);
+ intent.putExtra(EXTRA_ERROR, errorMessage);
+ if (errorMessage != null)
+ setResult(Activity.RESULT_CANCELED, intent);
+ else
+ setResult(Activity.RESULT_OK, intent);
+ intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ FlutterAuth0Plugin.resolve(token, errorMessage);
+ startActivityIfNeeded(intent, 0);
+ finish();
+ }
+
+}
diff --git a/android/src/main/java/io/flutter/plugins/flutterauth0/FlutterAuth0Plugin.java b/android/src/main/java/io/flutter/plugins/flutterauth0/FlutterAuth0Plugin.java
index 13f9428..0aed624 100644
--- a/android/src/main/java/io/flutter/plugins/flutterauth0/FlutterAuth0Plugin.java
+++ b/android/src/main/java/io/flutter/plugins/flutterauth0/FlutterAuth0Plugin.java
@@ -1,132 +1,82 @@
package io.flutter.plugins.flutterauth0;
import android.app.Activity;
-import android.os.Bundle;
-import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
-import android.os.Handler;
-import android.support.annotation.NonNull;
-import android.support.customtabs.CustomTabsIntent;
-import android.util.Base64;
+import android.os.Bundle;
+import android.util.Log;
+// import android.os.Handler;
+import androidx.browser.customtabs.CustomTabsIntent;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
-import io.flutter.plugin.common.PluginRegistry;
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.HashMap;
+import io.flutter.plugin.common.PluginRegistry.Registrar;
+import io.flutter.plugin.common.PluginRegistry.ActivityResultListener;
import java.util.Map;
+import io.flutter.plugins.flutterauth0.common.AuthenticationFactory;
+
/** Flutter plugin for Auth0. */
public class FlutterAuth0Plugin implements MethodCallHandler {
- private final PluginRegistry.Registrar registrar;
- private static final String US_ASCII = "US-ASCII";
- private static final String SHA_256 = "SHA-256";
- private static final int CANCEL_EVENT_DELAY = 100;
- public static Result callbackResult;
+ private static final String TAG = FlutterAuth0Plugin.class.getName();
+ private static Registrar registrar;
+ private static final String CHANNEL = "io.flutter.plugins/auth0";
+ private static final int REQUEST = 1;
+ private static Result response;
- public static void registerWith(PluginRegistry.Registrar registrar) {
- final MethodChannel channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/auth0");
+ public static void registerWith(Registrar registrar) {
+ final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL);
FlutterAuth0Plugin instance = new FlutterAuth0Plugin(registrar);
channel.setMethodCallHandler(instance);
}
- private FlutterAuth0Plugin(PluginRegistry.Registrar registrar) {
- this.registrar = registrar;
+ private FlutterAuth0Plugin(Registrar pluginRegister) {
+ super();
+ registrar = pluginRegister;
}
@Override
public void onMethodCall(MethodCall call, Result result) {
- if (call.method.equals("showUrl")) {
- handleShowUrl(call, result);
+ response = result;
+ if (call.method.equals("authorize")) {
+ authorize(call);
} else if (call.method.equals("parameters")) {
- handleOauthParameters(call, result);
+ getOauthParameters(result);
} else if (call.method.equals("bundleIdentifier")) {
- handleBundleIdentifier(call, result);
+ getBundleIdentifier(result);
} else {
result.notImplemented();
}
}
@SuppressWarnings("unchecked")
- public void handleBundleIdentifier(MethodCall call, Result result) {
- result.success(this.registrar.context().getPackageName());
- }
-
- private void handleShowUrl(MethodCall call, Result result) {
- callbackResult = result;
- @SuppressWarnings("unchecked")
- Map arguments = (Map) call.arguments;
- final String url = (String) arguments.get("url");
- final Activity activity = this.registrar.activity();
- if (activity != null) {
- CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
- CustomTabsIntent customTabsIntent = builder.build();
- customTabsIntent.launchUrl(activity, Uri.parse(url));
- } else {
- final Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setData(Uri.parse(url));
- this.registrar.context().startActivity(intent);
- }
- }
-
- private void handleOauthParameters(MethodCall callback, Result result) {
- final String verifier = this.generateRandomValue();
- Map parameters = new HashMap<>();
- parameters.put("verifier", verifier);
- parameters.put("code_challenge", this.generateCodeChallenge(verifier));
- parameters.put("code_challenge_method", "S256");
- parameters.put("state", this.generateRandomValue());
- result.success(parameters);
- }
-
- public static void resolveWebAuthentication(String code, String error) {
- if (error != null)
- callbackResult.success(null);
- callbackResult.success(code);
+ public void getBundleIdentifier(Result result) {
+ String packageName = AuthenticationFactory.getIdentifier(registrar.context());
+ result.success(packageName);
}
- private String getBase64String(byte[] source) {
- return Base64.encodeToString(source, Base64.URL_SAFE | Base64.NO_WRAP | Base64.NO_PADDING);
+ private void getOauthParameters(Result result) {
+ Map params = AuthenticationFactory.getAuthParameters();
+ result.success(params);
}
- private byte[] getASCIIBytes(String value) {
- byte[] input;
- try {
- input = value.getBytes(US_ASCII);
- } catch (UnsupportedEncodingException e) {
- throw new IllegalStateException("Could not convert string to an ASCII byte array", e);
- }
- return input;
+ private void authorize(MethodCall call) {
+ final String url = (String) call.arguments;
+ final Activity activity = registrar.activity();
+ CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
+ CustomTabsIntent customTabsIntent = builder.build();
+ customTabsIntent.launchUrl(activity, Uri.parse(url));
}
- private byte[] getSHA256(byte[] input) {
- byte[] signature;
- try {
- MessageDigest md = MessageDigest.getInstance(SHA_256);
- md.update(input, 0, input.length);
- signature = md.digest();
- } catch (NoSuchAlgorithmException e) {
- throw new IllegalStateException("Failed to get SHA-256 signature", e);
- }
- return signature;
+ public static Activity getActivity() {
+ return registrar.activity();
}
- private String generateRandomValue() {
- SecureRandom sr = new SecureRandom();
- byte[] code = new byte[32];
- sr.nextBytes(code);
- return this.getBase64String(code);
+ public static void resolve(String code, String error) {
+ if (error != null)
+ response.error("ACTIVITY_FAILURE", error, null);
+ response.success(code);
}
- private String generateCodeChallenge(@NonNull String codeVerifier) {
- byte[] input = getASCIIBytes(codeVerifier);
- byte[] signature = getSHA256(input);
- return getBase64String(signature);
- }
}
\ No newline at end of file
diff --git a/android/src/main/java/io/flutter/plugins/flutterauth0/common/AuthenticationFactory.java b/android/src/main/java/io/flutter/plugins/flutterauth0/common/AuthenticationFactory.java
new file mode 100644
index 0000000..96b2e30
--- /dev/null
+++ b/android/src/main/java/io/flutter/plugins/flutterauth0/common/AuthenticationFactory.java
@@ -0,0 +1,77 @@
+package io.flutter.plugins.flutterauth0.common;
+
+import android.content.Context;
+import android.util.Base64;
+import androidx.annotation.NonNull;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AuthenticationFactory {
+
+ private static final String TAG = AuthenticationFactory.class.getName();
+ private static final String US_ASCII = "US-ASCII";
+ private static final String SHA_256 = "SHA-256";
+ private static final int CANCEL_EVENT_DELAY = 100;
+
+ public AuthenticationFactory() {
+ super();
+ }
+
+ public static String getIdentifier(Context context) {
+ return context.getPackageName();
+ }
+
+ public static Map getAuthParameters() {
+ final String verifier = generateRandomValue();
+ Map parameters = new HashMap<>();
+ parameters.put("verifier", verifier);
+ parameters.put("code_challenge", generateCodeChallenge(verifier));
+ parameters.put("code_challenge_method", "S256");
+ parameters.put("state", generateRandomValue());
+ return parameters;
+ }
+
+ private static String getBase64String(byte[] source) {
+ return Base64.encodeToString(source, Base64.URL_SAFE | Base64.NO_WRAP | Base64.NO_PADDING);
+ }
+
+ private static byte[] getASCIIBytes(String value) {
+ byte[] input;
+ try {
+ input = value.getBytes(US_ASCII);
+ } catch (UnsupportedEncodingException e) {
+ throw new IllegalStateException("Could not convert string to an ASCII byte array", e);
+ }
+ return input;
+ }
+
+ private static byte[] getSHA256(byte[] input) {
+ byte[] signature;
+ try {
+ MessageDigest md = MessageDigest.getInstance(SHA_256);
+ md.update(input, 0, input.length);
+ signature = md.digest();
+ } catch (NoSuchAlgorithmException e) {
+ throw new IllegalStateException("Failed to get SHA-256 signature", e);
+ }
+ return signature;
+ }
+
+ private static String generateRandomValue() {
+ SecureRandom sr = new SecureRandom();
+ byte[] code = new byte[32];
+ sr.nextBytes(code);
+ return getBase64String(code);
+ }
+
+ private static String generateCodeChallenge(@NonNull String codeVerifier) {
+ byte[] input = getASCIIBytes(codeVerifier);
+ byte[] signature = getSHA256(input);
+ return getBase64String(signature);
+ }
+}
\ No newline at end of file
diff --git a/example/.flutter-plugins b/example/.flutter-plugins
deleted file mode 100644
index fac6acd..0000000
--- a/example/.flutter-plugins
+++ /dev/null
@@ -1 +0,0 @@
-flutter_auth0=/Users/tangdev/GitLab/FlutterLibs/flutter-auth0/
diff --git a/example/README.md b/example/README.md
index b208817..477162f 100644
--- a/example/README.md
+++ b/example/README.md
@@ -1,8 +1,267 @@
-# flutter_auth0
+## Installation
-A new Flutter project.
+add `flutter_auth0: x.x.x.` to pubspec.yml file
-## Getting Started
+```bash
+flutter pub get
+```
-For help getting started with Flutter, view our online
-[documentation](https://flutter.io/).
+### Configuration
+
+> This section is for those that want to use [Web Authentication](#web-authentication), if you dont need it just ignore this section.
+
+#### Android
+
+In the file `android/app/src/main/AndroidManifest.xml` you must make sure the **MainActivity** of the app has a **launchMode** value of `singleTask` and add the following activity:
+
+```xml
+
+
+
+
+
+
+
+
+```
+
+So if you have `dennysegura.auth0.com` as your Auth0 domain you would have the following **MainActivity** configuration:
+
+```xml
+
+
+
+
+
+
+
+
+```
+
+#### iOS
+
+Inside the `ios` folder find the file `AppDelegate.[swift|m]` add the following to it
+
+```objc
+#import
+
+- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options {
+ return [FlutterAuth0Plugin application:app openURL:url options:options];
+}
+```
+
+Inside the `ios` folder open the `Info.plist` and locate the values for `CFBundleIdentifier`, `CFBundleURLSchemes` and then register a URL type entry using the value of `CFBundleIdentifier` as the value of `CFBundleURLSchemes`
+
+```xml
+CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ None
+ CFBundleURLName
+ auth0
+ CFBundleURLSchemes
+
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+
+
+
+```
+
+The `` value should be the literal value of the Bundle Identifier with no $ variables, for example: `dennysegura.auth0.com`.
+
+### Callback URL(s)
+
+Callback URLs are the URLs that Auth0 invokes after the authentication process. Auth0 routes your application back to this URL and appends additional parameters to it, including a token. Since callback URLs can be manipulated, you will need to add this URL to your Application's **Allowed Callback URLs** for security. This will enable Auth0 to recognize these URLs as valid. If omitted, authentication will not be successful.
+
+> Callback URLs must have a valid scheme value as defined by the [specification](https://tools.ietf.org/html/rfc3986#page-17). A "Redirect URI is not valid" error will raise if this format is not respected.
+
+
+Go to the [Auth0 Dashboard](https://manage.auth0.com/#/applications), select your application and make sure that **Allowed Callback URLs** contains the following:
+
+#### iOS
+
+```text
+{YOUR_BUNDLE_IDENTIFIER}://${YOUR_AUTH0_DOMAIN}/ios/{YOUR_BUNDLE_IDENTIFIER}/callback
+```
+
+#### Android
+
+```text
+{YOUR_APP_PACKAGE_NAME}://{YOUR_AUTH0_DOMAIN}/android/{YOUR_APP_PACKAGE_NAME}/callback
+```
+
+## Usage
+
+```dart
+import 'package:flutter_auth0/flutter_auth0.dart';
+
+class ... {
+Auth0 auth0;
+
+@override
+ void initState() {
+ ...
+ auth0 = Auth0(baseUrl: 'https://$domain/', clientId: 'auth0-client-id');
+ super.initState();
+ }
+}
+```
+
+### Web Authentication
+
+#### Log in
+
+```dart
+try {
+ var response = await
+ auth0.
+ webAuth.
+ authorize({
+ 'audience': 'https://$domain/userinfo',
+ 'scope': 'openid email offline_access',
+ });
+ DateTime now = DateTime.now();
+ showInfo('Web Login', '''
+ \ntoken_type: ${response['token_type']}
+ \nexpires_in: ${DateTime.fromMillisecondsSinceEpoch(response['expires_in'] + now.millisecondsSinceEpoch)}
+ \nrefreshToken: ${response['refresh_token']}
+ \naccess_token: ${response['access_token']}
+ ''');
+ webLogged = true;
+ currentWebAuth = Map.from(response);
+ setState(() {});
+} catch (e) {
+ print('Error: $e');
+}
+```
+
+> This snippet sets the `audience` to ensure OIDC compliant responses, this can also be achieved by enabling the **OIDC Conformant** switch in your Auth0 dashboard under `Application / Settings / Advanced OAuth`. For more information please check [this documentation](https://auth0.com/docs/api-auth/intro#how-to-use-the-new-flows).
+
+#### Log out
+
+```dart
+try {
+ await auth0.
+ webAuth.
+ clearSession();
+ webLogged = false;
+ setState(() {});
+} catch (e) {
+ print('Error: $e');
+}
+```
+
+### Authentication API
+
+### Important: Database Connection Authentication
+
+Since June 2017 new Clients no longer have the **Password Grant Type*** enabled by default.
+If you are accessing a Database Connection using `passwordRealm` then you will need to enable the Password Grant Type, please follow [this guide](https://auth0.com/docs/clients/client-grant-types#how-to-edit-the-client-grant_types-property).
+
+#### Login with Password Realm Grant
+
+```dart
+try {
+ var response = await auth0.auth.passwordRealm({
+ 'username': 'info@auth0.com',
+ 'password': 'password',
+ 'realm': 'Username-Password-Authentication'
+ });
+ showInfo('Sign In', '''
+ \nAccess Token: ${response['access_token']}
+ ''');
+} catch (e) {
+ print(e);
+}
+```
+
+#### Get user information using user's access_token
+
+```dart
+try {
+ var authClient = Auth0Auth(
+ auth0.auth.clientId, auth0.auth.client.baseUrl,
+ bearer: 'user access_token');
+ var info = await authClient.getUserInfo();
+ String buffer = '';
+ info.forEach((k, v) => buffer = '$buffer\n$k: $v');
+ showInfo('User Info', buffer);
+} catch (e) {
+ print(e);
+}
+```
+
+#### Getting new access token with refresh token
+
+```dart
+try {
+ var response = await auth0.client.refreshToken({
+ 'refreshToken': 'user refresh_token',
+ });
+ DateTime now = DateTime.now();
+ showInfo('Refresh Token', '''
+ \ntoken_type: ${response['token_type']}
+ \nexpires_in: ${DateTime.fromMillisecondsSinceEpoch(response['expires_in'] + now.millisecondsSinceEpoch)}
+ \naccess_token: ${response['access_token']}
+ ''');
+} catch (e) {
+ print('Error: $e');
+}
+```
+
+#### Create user in database connection
+
+```dart
+try {
+ var response = await auth0.auth.createUser({
+ 'email': 'info@auth0.com',
+ 'password': 'password',
+ 'connection': 'Username-Password-Authentication'
+ });
+ showInfo('Sign Up', '''
+ \nid: ${response['_id']}
+ \nusername/email: ${response['email']}
+ ''');
+} catch (e) {
+ print(e);
+}
+```
+
+### Management API (Users)
+
+#### Patch user with user_metadata
+
+```dart
+try {
+ var response = await auth0
+ .users('user token')
+ .patchUser({'id': 'user_id',
+ 'metadata': {'first_name': 'John', 'last_name': 'Doe'}
+ });
+ print(response);
+} catch (e) {
+ print(e);
+}
+```
+
+### Get full user profile
+
+```dart
+try {
+ var response = await auth0
+ .users('user token')
+ .getUser({id: "user_id"});
+ print(response);
+} catch (e) {
+ print(e);
+}
+```
\ No newline at end of file
diff --git a/example/android/.gradle/4.4/fileChanges/last-build.bin b/example/android/.gradle/4.4/fileChanges/last-build.bin
deleted file mode 100644
index f76dd23..0000000
Binary files a/example/android/.gradle/4.4/fileChanges/last-build.bin and /dev/null differ
diff --git a/example/android/.gradle/4.4/fileContent/fileContent.lock b/example/android/.gradle/4.4/fileContent/fileContent.lock
deleted file mode 100644
index 3bd3d6f..0000000
Binary files a/example/android/.gradle/4.4/fileContent/fileContent.lock and /dev/null differ
diff --git a/example/android/.gradle/4.4/fileHashes/fileHashes.bin b/example/android/.gradle/4.4/fileHashes/fileHashes.bin
deleted file mode 100644
index 6151f08..0000000
Binary files a/example/android/.gradle/4.4/fileHashes/fileHashes.bin and /dev/null differ
diff --git a/example/android/.gradle/4.4/fileHashes/fileHashes.lock b/example/android/.gradle/4.4/fileHashes/fileHashes.lock
deleted file mode 100644
index 68c6c09..0000000
Binary files a/example/android/.gradle/4.4/fileHashes/fileHashes.lock and /dev/null differ
diff --git a/example/android/.gradle/4.4/fileHashes/resourceHashesCache.bin b/example/android/.gradle/4.4/fileHashes/resourceHashesCache.bin
deleted file mode 100644
index 199675d..0000000
Binary files a/example/android/.gradle/4.4/fileHashes/resourceHashesCache.bin and /dev/null differ
diff --git a/example/android/.gradle/4.4/javaCompile/classAnalysis.bin b/example/android/.gradle/4.4/javaCompile/classAnalysis.bin
deleted file mode 100644
index 38f1d2d..0000000
Binary files a/example/android/.gradle/4.4/javaCompile/classAnalysis.bin and /dev/null differ
diff --git a/example/android/.gradle/4.4/javaCompile/jarAnalysis.bin b/example/android/.gradle/4.4/javaCompile/jarAnalysis.bin
deleted file mode 100644
index 42896aa..0000000
Binary files a/example/android/.gradle/4.4/javaCompile/jarAnalysis.bin and /dev/null differ
diff --git a/example/android/.gradle/4.4/javaCompile/javaCompile.lock b/example/android/.gradle/4.4/javaCompile/javaCompile.lock
deleted file mode 100644
index bdc665b..0000000
Binary files a/example/android/.gradle/4.4/javaCompile/javaCompile.lock and /dev/null differ
diff --git a/example/android/.gradle/4.4/javaCompile/taskHistory.bin b/example/android/.gradle/4.4/javaCompile/taskHistory.bin
deleted file mode 100644
index 5064c43..0000000
Binary files a/example/android/.gradle/4.4/javaCompile/taskHistory.bin and /dev/null differ
diff --git a/example/android/.gradle/4.4/javaCompile/taskJars.bin b/example/android/.gradle/4.4/javaCompile/taskJars.bin
deleted file mode 100644
index f50cde7..0000000
Binary files a/example/android/.gradle/4.4/javaCompile/taskJars.bin and /dev/null differ
diff --git a/example/android/.gradle/4.4/taskHistory/taskHistory.bin b/example/android/.gradle/4.4/taskHistory/taskHistory.bin
deleted file mode 100644
index 9a01489..0000000
Binary files a/example/android/.gradle/4.4/taskHistory/taskHistory.bin and /dev/null differ
diff --git a/example/android/.gradle/4.4/taskHistory/taskHistory.lock b/example/android/.gradle/4.4/taskHistory/taskHistory.lock
deleted file mode 100644
index 2e89c1b..0000000
Binary files a/example/android/.gradle/4.4/taskHistory/taskHistory.lock and /dev/null differ
diff --git a/example/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/example/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock
deleted file mode 100644
index 9640e0b..0000000
Binary files a/example/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ
diff --git a/example/android/.gradle/buildOutputCleanup/cache.properties b/example/android/.gradle/buildOutputCleanup/cache.properties
deleted file mode 100644
index 1125eb1..0000000
--- a/example/android/.gradle/buildOutputCleanup/cache.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-#Wed Oct 31 18:08:26 ART 2018
-gradle.version=4.4
diff --git a/example/android/.gradle/buildOutputCleanup/outputFiles.bin b/example/android/.gradle/buildOutputCleanup/outputFiles.bin
deleted file mode 100644
index d8e11e6..0000000
Binary files a/example/android/.gradle/buildOutputCleanup/outputFiles.bin and /dev/null differ
diff --git a/example/android/app/.classpath b/example/android/app/.classpath
index eb19361..32d6691 100644
--- a/example/android/app/.classpath
+++ b/example/android/app/.classpath
@@ -1,6 +1,6 @@
-
+
diff --git a/example/android/app/.settings/org.eclipse.jdt.core.prefs b/example/android/app/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..c51875c
--- /dev/null
+++ b/example/android/app/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=12
+org.eclipse.jdt.core.compiler.compliance=12
+org.eclipse.jdt.core.compiler.source=12
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
index 5bc81cb..afc43d3 100644
--- a/example/android/app/build.gradle
+++ b/example/android/app/build.gradle
@@ -25,7 +25,7 @@ apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
- compileSdkVersion 27
+ compileSdkVersion 28
lintOptions {
disable 'InvalidPackage'
@@ -35,10 +35,10 @@ android {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.flutterauth0"
minSdkVersion 16
- targetSdkVersion 27
+ targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
@@ -56,6 +56,6 @@ flutter {
dependencies {
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'
-}
+ androidTestImplementation 'androidx.test:runner:1.0.2'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.0.2'
+}
\ No newline at end of file
diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml
index 7afb553..7a912bc 100644
--- a/example/android/app/src/main/AndroidManifest.xml
+++ b/example/android/app/src/main/AndroidManifest.xml
@@ -36,13 +36,14 @@
+ android:name="io.flutter.plugins.flutterauth0.AuthenticationReceiver"
+ android:parentActivityName="com.example.flutterauth0.MainActivity">
diff --git a/example/android/app/src/main/java/com/example/flutterauth0/RedirectUriReceiver.java b/example/android/app/src/main/java/com/example/flutterauth0/RedirectUriReceiver.java
index 90ab25f..37c618c 100644
--- a/example/android/app/src/main/java/com/example/flutterauth0/RedirectUriReceiver.java
+++ b/example/android/app/src/main/java/com/example/flutterauth0/RedirectUriReceiver.java
@@ -8,17 +8,18 @@
import com.example.flutterauth0.MainActivity;
public class RedirectUriReceiver extends Activity {
+ private static final String TAG = RedirectUriReceiver.class.getName();
public void onCreate(Bundle savedInstanceBundle) {
super.onCreate(savedInstanceBundle);
- Intent intent = this.getIntent();
- Uri uri = intent.getData();
- String access_token = uri.getQueryParameter("code");
- String error = uri.getQueryParameter("error");
- FlutterAuth0Plugin.resolveWebAuthentication(access_token, error);
- Intent openMainActivity = new Intent(RedirectUriReceiver.this, MainActivity.class);
- openMainActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
- startActivityIfNeeded(openMainActivity, 0);
- this.finish();
+ // Intent intent = this.getIntent();
+ // Uri uri = intent.getData();
+ // String access_token = uri.getQueryParameter("code");
+ // String error = uri.getQueryParameter("error");
+ // FlutterAuth0Plugin.resolveWebAuthentication(access_token, error);
+ // Intent openMainActivity = new Intent(RedirectUriReceiver.this, MainActivity.class);
+ // openMainActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ // startActivityIfNeeded(openMainActivity, 0);
+ // this.finish();
}
}
\ No newline at end of file
diff --git a/example/android/build.gradle b/example/android/build.gradle
index d4225c7..b1f5d82 100644
--- a/example/android/build.gradle
+++ b/example/android/build.gradle
@@ -5,7 +5,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.1.2'
+ classpath 'com.android.tools.build:gradle:3.4.1'
}
}
@@ -19,11 +19,9 @@ allprojects {
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
-}
-subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
-}
+}
\ No newline at end of file
diff --git a/example/android/gradle.properties b/example/android/gradle.properties
index 8bd86f6..a5965ab 100644
--- a/example/android/gradle.properties
+++ b/example/android/gradle.properties
@@ -1 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
+android.enableR8=true
+android.useAndroidX=true
+android.enableJetifier=true
\ No newline at end of file
diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties
index 9372d0f..cd0021e 100644
--- a/example/android/gradle/wrapper/gradle-wrapper.properties
+++ b/example/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
\ No newline at end of file
diff --git a/example/android/local.properties b/example/android/local.properties
deleted file mode 100644
index a1456fb..0000000
--- a/example/android/local.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-sdk.dir=/Users/tangdev/Library/Android/sdk
-flutter.sdk=/Users/tangdev/development/flutter
-flutter.versionName=1.0.0
-flutter.versionCode=1
-flutter.buildMode=debug
\ No newline at end of file
diff --git a/example/ios/.symlinks/flutter b/example/ios/.symlinks/flutter
index 9f56e46..13b39c0 120000
--- a/example/ios/.symlinks/flutter
+++ b/example/ios/.symlinks/flutter
@@ -1 +1 @@
-/Users/tangdev/development/flutter/bin/cache/artifacts/engine
\ No newline at end of file
+/Users/dennysegura/development/flutter/bin/cache/artifacts/engine
\ No newline at end of file
diff --git a/example/ios/.symlinks/plugins/flutter_auth0 b/example/ios/.symlinks/plugins/flutter_auth0
index c4a2c26..11c0c95 120000
--- a/example/ios/.symlinks/plugins/flutter_auth0
+++ b/example/ios/.symlinks/plugins/flutter_auth0
@@ -1 +1 @@
-/Users/tangdev/GitLab/FlutterLibs/flutter-auth0
\ No newline at end of file
+/Users/dennysegura/Dev/Libs/flutter/flutter-auth0
\ No newline at end of file
diff --git a/example/ios/Flutter/App.framework/App b/example/ios/Flutter/App.framework/App
index f30d0a7..04de487 100755
Binary files a/example/ios/Flutter/App.framework/App and b/example/ios/Flutter/App.framework/App differ
diff --git a/example/ios/Flutter/Flutter.framework/Flutter b/example/ios/Flutter/Flutter.framework/Flutter
index 2330989..783414e 100755
Binary files a/example/ios/Flutter/Flutter.framework/Flutter and b/example/ios/Flutter/Flutter.framework/Flutter differ
diff --git a/example/ios/Flutter/Flutter.framework/Headers/Flutter.h b/example/ios/Flutter/Flutter.framework/Headers/Flutter.h
index 364912a..9135c82 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/Flutter.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/Flutter.h
@@ -8,6 +8,9 @@
/**
BREAKING CHANGES:
+ December 17, 2018:
+ - Changed designated initializer on FlutterEngine
+
October 5, 2018:
- Removed FlutterNavigationController.h/.mm
- Changed return signature of `FlutterDartHeadlessCodeRunner.run*` from void
diff --git a/example/ios/Flutter/Flutter.framework/Headers/FlutterChannels.h b/example/ios/Flutter/Flutter.framework/Headers/FlutterChannels.h
index d582ce4..83c9e98 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/FlutterChannels.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/FlutterChannels.h
@@ -234,7 +234,10 @@ FLUTTER_EXPORT
*/
- (void)invokeMethod:(NSString*)method
arguments:(id _Nullable)arguments
- result:(FlutterResult _Nullable)callback;
+ result:(FlutterResult _Nullable)callback
+ // TODO: Add macOS support for replies once
+ // https://github.com/flutter/flutter/issues/18852 is fixed.
+ API_UNAVAILABLE(macos);
/**
* Registers a handler for method calls from the Flutter side.
diff --git a/example/ios/Flutter/Flutter.framework/Headers/FlutterCodecs.h b/example/ios/Flutter/Flutter.framework/Headers/FlutterCodecs.h
index 0034a07..96c1f5c 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/FlutterCodecs.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/FlutterCodecs.h
@@ -116,8 +116,8 @@ FLUTTER_EXPORT
- (UInt32)readSize;
- (void)readAlignment:(UInt8)alignment;
- (NSString*)readUTF8;
-- (id)readValue;
-- (id)readValueOfType:(UInt8)type;
+- (nullable id)readValue;
+- (nullable id)readValueOfType:(UInt8)type;
@end
/**
diff --git a/example/ios/Flutter/Flutter.framework/Headers/FlutterDartProject.h b/example/ios/Flutter/Flutter.framework/Headers/FlutterDartProject.h
index f8850e2..032d1c2 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/FlutterDartProject.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/FlutterDartProject.h
@@ -16,47 +16,58 @@ FLUTTER_EXPORT
@interface FlutterDartProject : NSObject
/**
- * Initializes with a specific
+ * Initializes a Flutter Dart project from a bundle.
*/
- (instancetype)initWithPrecompiledDartBundle:(NSBundle*)bundle NS_DESIGNATED_INITIALIZER;
/**
- * Initializes with a specific set of Flutter Assets, with a specified location of
- * main() and Dart packages.
+ * Unavailable - use `init` instead.
*/
-- (instancetype)initWithFlutterAssets:(NSURL*)flutterAssetsURL
- dartMain:(NSURL*)dartMainURL
- packages:(NSURL*)dartPackages NS_DESIGNATED_INITIALIZER;
+- (instancetype)initFromDefaultSourceForConfiguration FLUTTER_UNAVAILABLE("Use -init instead.");
/**
- * Initializes from a specific set of Flutter Assets.
+ * Returns the file name for the given asset. If the bundle with the identifier
+ * "io.flutter.flutter.app" exists, it will try use that bundle; otherwise, it
+ * will use the main bundle. To specify a different bundle, use
+ * `-lookupKeyForAsset:asset:fromBundle`.
+ *
+ * @param asset The name of the asset. The name can be hierarchical.
+ * @return the file name to be used for lookup in the main bundle.
*/
-- (instancetype)initWithFlutterAssetsWithScriptSnapshot:(NSURL*)flutterAssetsURL
- NS_DESIGNATED_INITIALIZER;
++ (NSString*)lookupKeyForAsset:(NSString*)asset;
/**
- * Unavailable - use `init` instead.
+ * Returns the file name for the given asset.
+ * The returned file name can be used to access the asset in the supplied bundle.
+ *
+ * @param asset The name of the asset. The name can be hierarchical.
+ * @param bundle The `NSBundle` to use for looking up the asset.
+ * @return the file name to be used for lookup in the main bundle.
*/
-- (instancetype)initFromDefaultSourceForConfiguration FLUTTER_UNAVAILABLE("Use -init instead.");
++ (NSString*)lookupKeyForAsset:(NSString*)asset fromBundle:(NSBundle*)bundle;
/**
- * Returns the file name for the given asset.
+ * Returns the file name for the given asset which originates from the specified package.
* The returned file name can be used to access the asset in the application's main bundle.
*
* @param asset The name of the asset. The name can be hierarchical.
+ * @param package The name of the package from which the asset originates.
* @return the file name to be used for lookup in the main bundle.
*/
-+ (NSString*)lookupKeyForAsset:(NSString*)asset;
++ (NSString*)lookupKeyForAsset:(NSString*)asset fromPackage:(NSString*)package;
/**
* Returns the file name for the given asset which originates from the specified package.
- * The returned file name can be used to access the asset in the application's main bundle.
+ * The returned file name can be used to access the asset in the specified bundle.
*
* @param asset The name of the asset. The name can be hierarchical.
* @param package The name of the package from which the asset originates.
+ * @param bundle The bundle to use when doing the lookup.
* @return the file name to be used for lookup in the main bundle.
*/
-+ (NSString*)lookupKeyForAsset:(NSString*)asset fromPackage:(NSString*)package;
++ (NSString*)lookupKeyForAsset:(NSString*)asset
+ fromPackage:(NSString*)package
+ fromBundle:(NSBundle*)bundle;
/**
* Returns the default identifier for the bundle where we expect to find the Flutter Dart
diff --git a/example/ios/Flutter/Flutter.framework/Headers/FlutterEngine.h b/example/ios/Flutter/Flutter.framework/Headers/FlutterEngine.h
index 1d435ac..c65bef7 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/FlutterEngine.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/FlutterEngine.h
@@ -38,8 +38,28 @@
* One of these methods must be invoked before calling `-setViewController:`.
*/
FLUTTER_EXPORT
-@interface FlutterEngine
- : NSObject
+@interface FlutterEngine : NSObject
+/**
+ * Initialize this FlutterEngine with a `FlutterDartProject`.
+ *
+ * If the FlutterDartProject is not specified, the FlutterEngine will attempt to locate
+ * the project in a default location (the flutter_assets folder in the iOS application
+ * bundle).
+ *
+ * A newly initialized engine will not run the `FlutterDartProject` until either
+ * `-runWithEntrypoint:` or `-runWithEntrypoint:libraryURI:` is called.
+ *
+ * FlutterEngine created with this method will have allowHeadlessExecution set to `YES`.
+ * This means that the engine will continue to run regardless of whether a `FlutterViewController`
+ * is attached to it or not, until `-destroyContext:` is called or the process finishes.
+ *
+ * @param labelPrefix The label prefix used to identify threads for this instance. Should
+ * be unique across FlutterEngine instances, and is used in instrumentation to label
+ * the threads used by this FlutterEngine.
+ * @param projectOrNil The `FlutterDartProject` to run.
+ */
+- (instancetype)initWithName:(NSString*)labelPrefix project:(FlutterDartProject*)projectOrNil;
+
/**
* Initialize this FlutterEngine with a `FlutterDartProject`.
*
@@ -54,9 +74,12 @@ FLUTTER_EXPORT
* be unique across FlutterEngine instances, and is used in instrumentation to label
* the threads used by this FlutterEngine.
* @param projectOrNil The `FlutterDartProject` to run.
+ * @param allowHeadlessExecution Whether or not to allow this instance to continue
+ * running after passing a nil `FlutterViewController` to `-setViewController:`.
*/
- (instancetype)initWithName:(NSString*)labelPrefix
- project:(FlutterDartProject*)projectOrNil NS_DESIGNATED_INITIALIZER;
+ project:(FlutterDartProject*)projectOrNil
+ allowHeadlessExecution:(BOOL)allowHeadlessExecution NS_DESIGNATED_INITIALIZER;
/**
* The default initializer is not available for this object.
@@ -64,6 +87,8 @@ FLUTTER_EXPORT
*/
- (instancetype)init NS_UNAVAILABLE;
++ (instancetype)new NS_UNAVAILABLE;
+
/**
* Runs a Dart program on an Isolate from the main Dart library (i.e. the library that
* contains `main()`).
@@ -97,6 +122,42 @@ FLUTTER_EXPORT
*/
- (BOOL)runWithEntrypoint:(NSString*)entrypoint libraryURI:(NSString*)uri;
+/**
+ * Destroy running context for an engine.
+ *
+ * This method can be used to force the FlutterEngine object to release all resources.
+ * After sending this message, the object will be in an unusable state until it is deallocated.
+ * Accessing properties or sending messages to it will result in undefined behavior or runtime
+ * errors.
+ */
+- (void)destroyContext;
+
+/**
+ * Ensures that Flutter will generate a semantics tree.
+ *
+ * This is enabled by default if certain accessibility services are turned on by
+ * the user, or when using a Simulator. This method allows a user to turn
+ * semantics on when they would not ordinarily be generated and the performance
+ * overhead is not a concern, e.g. for UI testing. Note that semantics should
+ * never be programmatically turned off, as it would potentially disable
+ * accessibility services an end user has requested.
+ *
+ * This method must only be called after launching the engine via
+ * `-runWithEntrypoint:` or `-runWithEntryPoint:libraryURI`.
+ *
+ * Although this method returns synchronously, it does not guarantee that a
+ * semantics tree is actually available when the method returns. It
+ * synchronously ensures that the next frame the Flutter framework creates will
+ * have a semantics tree.
+ *
+ * You can subscribe to semantics updates via `NSNotificationCenter` by adding
+ * an observer for the name `FlutterSemanticsUpdateNotification`. The `object`
+ * parameter will be the `FlutterViewController` associated with the semantics
+ * update. This will asynchronously fire after a semantics tree has actually
+ * built (which may be some time after the frame has been rendered).
+ */
+- (void)ensureSemanticsEnabled;
+
/**
* Sets the `FlutterViewController` for this instance. The FlutterEngine must be
* running (e.g. a successful call to `-runWithEntrypoint:` or `-runWithEntrypoint:libraryURI`)
@@ -166,6 +227,28 @@ FLUTTER_EXPORT
*/
@property(nonatomic, readonly) FlutterBasicMessageChannel* settingsChannel;
+/**
+ * The `NSURL` of the observatory for the service isolate.
+ *
+ * This is only set in debug and profile runtime modes, and only after the
+ * observatory service is ready. In release mode or before the observatory has
+ * started, it returns `nil`.
+ */
+@property(nonatomic, readonly) NSURL* observatoryUrl;
+
+/**
+ * The `FlutterBinaryMessenger` associated with this FlutterEngine (used for communicating with
+ * channels).
+ */
+@property(nonatomic, readonly) NSObject* binaryMessenger;
+
+/**
+ * The UI Isolate ID of of the engine.
+ *
+ * This property will be nil if the engine is not running.
+ */
+@property(nonatomic, readonly, copy) NSString* isolateId;
+
@end
#endif // FLUTTER_FLUTTERENGINE_H_
diff --git a/example/ios/Flutter/Flutter.framework/Headers/FlutterHeadlessDartRunner.h b/example/ios/Flutter/Flutter.framework/Headers/FlutterHeadlessDartRunner.h
index e51dc6d..24acbc0 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/FlutterHeadlessDartRunner.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/FlutterHeadlessDartRunner.h
@@ -46,8 +46,25 @@ FLUTTER_DEPRECATED("FlutterEngine should be used rather than FlutterHeadlessDart
* be unique across FlutterEngine instances
* @param projectOrNil The `FlutterDartProject` to run.
*/
+- (instancetype)initWithName:(NSString*)labelPrefix project:(FlutterDartProject*)projectOrNil;
+
+/**
+ * Iniitalize this FlutterHeadlessDartRunner with a `FlutterDartProject`.
+ *
+ * If the FlutterDartProject is not specified, the FlutterHeadlessDartRunner will attempt to locate
+ * the project in a default location.
+ *
+ * A newly initialized engine will not run the `FlutterDartProject` until either
+ * `-runWithEntrypoint:` or `-runWithEntrypoint:libraryURI` is called.
+ *
+ * @param labelPrefix The label prefix used to identify threads for this instance. Should
+ * be unique across FlutterEngine instances
+ * @param projectOrNil The `FlutterDartProject` to run.
+ * @param allowHeadlessExecution Must be set to `YES`.
+ */
- (instancetype)initWithName:(NSString*)labelPrefix
- project:(FlutterDartProject*)projectOrNil NS_DESIGNATED_INITIALIZER;
+ project:(FlutterDartProject*)projectOrNil
+ allowHeadlessExecution:(BOOL)allowHeadlessExecution NS_DESIGNATED_INITIALIZER;
/**
* Not recommended for use - will initialize with a default label ("io.flutter.headless")
diff --git a/example/ios/Flutter/Flutter.framework/Headers/FlutterPlugin.h b/example/ios/Flutter/Flutter.framework/Headers/FlutterPlugin.h
index bc6997f..95ec3ad 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/FlutterPlugin.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/FlutterPlugin.h
@@ -16,102 +16,74 @@
NS_ASSUME_NONNULL_BEGIN
@protocol FlutterPluginRegistrar;
+@protocol FlutterPluginRegistry;
-/**
- * Implemented by the iOS part of a Flutter plugin.
- *
- * Defines a set of optional callback methods and a method to set up the plugin
- * and register it to be called by other application components.
- */
-@protocol FlutterPlugin
-@required
-/**
- * Registers this plugin using the context information and callback registration
- * methods exposed by the given registrar.
- *
- * The registrar is obtained from a `FlutterPluginRegistry` which keeps track of
- * the identity of registered plugins and provides basic support for cross-plugin
- * coordination.
- *
- * The caller of this method, a plugin registrant, is usually autogenerated by
- * Flutter tooling based on declared plugin dependencies. The generated registrant
- * asks the registry for a registrar for each plugin, and calls this method to
- * allow the plugin to initialize itself and register callbacks with application
- * objects available through the registrar protocol.
- *
- * @param registrar A helper providing application context and methods for
- * registering callbacks.
+#pragma mark -
+/***************************************************************************************************
+ * Protocol for listener of events from the UIApplication, typically a FlutterPlugin.
*/
-+ (void)registerWithRegistrar:(NSObject*)registrar;
+@protocol FlutterApplicationLifeCycleDelegate
@optional
/**
- * Called if this plugin has been registered to receive `FlutterMethodCall`s.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @param call The method call command object.
- * @param result A callback for submitting the result of the call.
- */
-- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result;
-
-/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
- *
- * @return `NO` if this plugin vetoes application launch.
+ * @return `NO` if this vetoes application launch.
*/
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `NO` if this plugin vetoes application launch.
+ * @return `NO` if this vetoes application launch.
*/
- (BOOL)application:(UIApplication*)application
willFinishLaunchingWithOptions:(NSDictionary*)launchOptions;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*/
- (void)applicationDidBecomeActive:(UIApplication*)application;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*/
- (void)applicationWillResignActive:(UIApplication*)application;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*/
- (void)applicationDidEnterBackground:(UIApplication*)application;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*/
- (void)applicationWillEnterForeground:(UIApplication*)application;
/**
- Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ Called if this has been registered for `UIApplicationDelegate` callbacks.
*/
- (void)applicationWillTerminate:(UIApplication*)application;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*/
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void)application:(UIApplication*)application
- didRegisterUserNotificationSettings:(UIUserNotificationSettings*)notificationSettings;
-#pragma GCC diagnostic pop
+ didRegisterUserNotificationSettings:(UIUserNotificationSettings*)notificationSettings
+ API_DEPRECATED(
+ "See -[UIApplicationDelegate application:didRegisterUserNotificationSettings:] deprecation",
+ ios(8.0, 10.0));
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*/
- (void)application:(UIApplication*)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `YES` if this plugin handles the request.
+ * @return `YES` if this handles the request.
*/
- (BOOL)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo
@@ -121,7 +93,10 @@ NS_ASSUME_NONNULL_BEGIN
* Calls all plugins registered for `UIApplicationDelegate` callbacks.
*/
- (void)application:(UIApplication*)application
- didReceiveLocalNotification:(UILocalNotification*)notification;
+ didReceiveLocalNotification:(UILocalNotification*)notification
+ API_DEPRECATED(
+ "See -[UIApplicationDelegate application:didReceiveLocalNotification:] deprecation",
+ ios(4.0, 10.0));
/**
* Calls all plugins registered for `UNUserNotificationCenterDelegate` callbacks.
@@ -133,25 +108,25 @@ NS_ASSUME_NONNULL_BEGIN
API_AVAILABLE(ios(10));
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `YES` if this plugin handles the request.
+ * @return `YES` if this handles the request.
*/
- (BOOL)application:(UIApplication*)application
openURL:(NSURL*)url
options:(NSDictionary*)options;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `YES` if this plugin handles the request.
+ * @return `YES` if this handles the request.
*/
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `YES` if this plugin handles the request.
+ * @return `YES` if this handles the request.
*/
- (BOOL)application:(UIApplication*)application
openURL:(NSURL*)url
@@ -159,9 +134,9 @@ NS_ASSUME_NONNULL_BEGIN
annotation:(id)annotation;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `YES` if this plugin handles the request.
+ * @return `YES` if this handles the request.
*/
- (BOOL)application:(UIApplication*)application
performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
@@ -169,33 +144,95 @@ NS_ASSUME_NONNULL_BEGIN
API_AVAILABLE(ios(9.0));
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `YES` if this plugin handles the request.
+ * @return `YES` if this handles the request.
*/
- (BOOL)application:(UIApplication*)application
handleEventsForBackgroundURLSession:(nonnull NSString*)identifier
completionHandler:(nonnull void (^)(void))completionHandler;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `YES` if this plugin handles the request.
+ * @return `YES` if this handles the request.
*/
- (BOOL)application:(UIApplication*)application
performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
/**
- * Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
+ * Called if this has been registered for `UIApplicationDelegate` callbacks.
*
- * @return `YES` if this plugin handles the request.
+ * @return `YES` if this handles the request.
*/
- (BOOL)application:(UIApplication*)application
continueUserActivity:(NSUserActivity*)userActivity
restorationHandler:(void (^)(NSArray*))restorationHandler;
@end
+#pragma mark -
+/***************************************************************************************************
+ * A plugin registration callback.
+ *
+ * Used for registering plugins with additional instances of
+ * `FlutterPluginRegistry`.
+ *
+ * @param registry The registry to register plugins with.
+ */
+typedef void (*FlutterPluginRegistrantCallback)(NSObject* registry);
+
+#pragma mark -
+/***************************************************************************************************
+ * Implemented by the iOS part of a Flutter plugin.
+ *
+ * Defines a set of optional callback methods and a method to set up the plugin
+ * and register it to be called by other application components.
+ */
+@protocol FlutterPlugin
+@required
+/**
+ * Registers this plugin using the context information and callback registration
+ * methods exposed by the given registrar.
+ *
+ * The registrar is obtained from a `FlutterPluginRegistry` which keeps track of
+ * the identity of registered plugins and provides basic support for cross-plugin
+ * coordination.
+ *
+ * The caller of this method, a plugin registrant, is usually autogenerated by
+ * Flutter tooling based on declared plugin dependencies. The generated registrant
+ * asks the registry for a registrar for each plugin, and calls this method to
+ * allow the plugin to initialize itself and register callbacks with application
+ * objects available through the registrar protocol.
+ *
+ * @param registrar A helper providing application context and methods for
+ * registering callbacks.
+ */
++ (void)registerWithRegistrar:(NSObject*)registrar;
+@optional
+/**
+ * Set a callback for registering plugins to an additional `FlutterPluginRegistry`,
+ * including headless `FlutterEngine` instances.
+ *
+ * This method is typically called from within an application's `AppDelegate` at
+ * startup to allow for plugins which create additional `FlutterEngine` instances
+ * to register the application's plugins.
+ *
+ * @param callback A callback for registering some set of plugins with a
+ * `FlutterPluginRegistry`.
+ */
++ (void)setPluginRegistrantCallback:(FlutterPluginRegistrantCallback)callback;
+@optional
/**
+ * Called if this plugin has been registered to receive `FlutterMethodCall`s.
+ *
+ * @param call The method call command object.
+ * @param result A callback for submitting the result of the call.
+ */
+- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result;
+@end
+
+#pragma mark -
+/***************************************************************************************************
*Registration context for a single `FlutterPlugin`, providing a one stop shop
*for the plugin to access contextual information and register callbacks for
*various application events.
@@ -222,7 +259,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSObject*)textures;
/**
- * Registers a `FlutterPlatformViewFactory` for creation of platfrom views.
+ * Registers a `FlutterPlatformViewFactory` for creation of platform views.
*
* Plugins expose `UIView` for embedding in Flutter apps by registering a view factory.
*
@@ -285,7 +322,8 @@ NS_ASSUME_NONNULL_BEGIN
- (NSString*)lookupKeyForAsset:(NSString*)asset fromPackage:(NSString*)package;
@end
-/**
+#pragma mark -
+/***************************************************************************************************
* A registry of Flutter iOS plugins.
*
* Plugins are identified by unique string keys, typically the name of the
@@ -330,12 +368,13 @@ NS_ASSUME_NONNULL_BEGIN
- (NSObject*)valuePublishedByPlugin:(NSString*)pluginKey;
@end
-/**
+#pragma mark -
+/***************************************************************************************************
* Implement this in the `UIAppDelegate` of your app to enable Flutter plugins to register
* themselves to the application life cycle events.
*/
@protocol FlutterAppLifeCycleProvider
-- (void)addApplicationLifeCycleDelegate:(NSObject*)delegate;
+- (void)addApplicationLifeCycleDelegate:(NSObject*)delegate;
@end
NS_ASSUME_NONNULL_END;
diff --git a/example/ios/Flutter/Flutter.framework/Headers/FlutterPluginAppLifeCycleDelegate.h b/example/ios/Flutter/Flutter.framework/Headers/FlutterPluginAppLifeCycleDelegate.h
index a8dda28..f69cbd2 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/FlutterPluginAppLifeCycleDelegate.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/FlutterPluginAppLifeCycleDelegate.h
@@ -14,13 +14,14 @@ NS_ASSUME_NONNULL_BEGIN
*/
FLUTTER_EXPORT
@interface FlutterPluginAppLifeCycleDelegate : NSObject
+
/**
* Registers `delegate` to receive life cycle callbacks via this FlutterPluginAppLifecycleDelegate
* as long as it is alive.
*
* `delegate` will only referenced weakly.
*/
-- (void)addDelegate:(NSObject*)delegate;
+- (void)addDelegate:(NSObject*)delegate;
/**
* Calls all plugins registered for `UIApplicationDelegate` callbacks.
@@ -38,39 +39,14 @@ FLUTTER_EXPORT
- (BOOL)application:(UIApplication*)application
willFinishLaunchingWithOptions:(NSDictionary*)launchOptions;
-/**
- * Calls all plugins registered for `UIApplicationDelegate` callbacks.
- */
-- (void)applicationDidBecomeActive:(UIApplication*)application;
-
-/**
- * Calls all plugins registered for `UIApplicationDelegate` callbacks.
- */
-- (void)applicationWillResignActive:(UIApplication*)application;
-
-/**
- * Calls all plugins registered for `UIApplicationDelegate` callbacks.
- */
-- (void)applicationDidEnterBackground:(UIApplication*)application;
-
-/**
- * Calls all plugins registered for `UIApplicationDelegate` callbacks.
- */
-- (void)applicationWillEnterForeground:(UIApplication*)application;
-
-/**
- * Calls all plugins registered for `UIApplicationDelegate` callbacks.
- */
-- (void)applicationWillTerminate:(UIApplication*)application;
-
/**
* Called if this plugin has been registered for `UIApplicationDelegate` callbacks.
*/
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void)application:(UIApplication*)application
- didRegisterUserNotificationSettings:(UIUserNotificationSettings*)notificationSettings;
-#pragma GCC diagnostic pop
+ didRegisterUserNotificationSettings:(UIUserNotificationSettings*)notificationSettings
+ API_DEPRECATED(
+ "See -[UIApplicationDelegate application:didRegisterUserNotificationSettings:] deprecation",
+ ios(8.0, 10.0));
/**
* Calls all plugins registered for `UIApplicationDelegate` callbacks.
@@ -89,7 +65,10 @@ FLUTTER_EXPORT
* Calls all plugins registered for `UIApplicationDelegate` callbacks.
*/
- (void)application:(UIApplication*)application
- didReceiveLocalNotification:(UILocalNotification*)notification;
+ didReceiveLocalNotification:(UILocalNotification*)notification
+ API_DEPRECATED(
+ "See -[UIApplicationDelegate application:didReceiveLocalNotification:] deprecation",
+ ios(4.0, 10.0));
/**
* Calls all plugins registered for `UNUserNotificationCenterDelegate` callbacks.
diff --git a/example/ios/Flutter/Flutter.framework/Headers/FlutterViewController.h b/example/ios/Flutter/Flutter.framework/Headers/FlutterViewController.h
index 53f3adc..ddbb87a 100644
--- a/example/ios/Flutter/Flutter.framework/Headers/FlutterViewController.h
+++ b/example/ios/Flutter/Flutter.framework/Headers/FlutterViewController.h
@@ -17,23 +17,33 @@
@class FlutterEngine;
+/**
+ * The name used for semantic update notifications via `NSNotificationCenter`.
+ *
+ * The object passed as the sender is the `FlutterViewController` associated
+ * with the update.
+ */
+FLUTTER_EXPORT
+extern NSNotificationName const FlutterSemanticsUpdateNotification;
+
/**
* A `UIViewController` implementation for Flutter views.
*
- * Dart execution, channel communication, texture registration, and plugin registration
- * are all handled by `FlutterEngine`. Calls on this class to those members all proxy
- * through to the `FlutterEngine` attached FlutterViewController.
+ * Dart execution, channel communication, texture registration, and plugin registration are all
+ * handled by `FlutterEngine`. Calls on this class to those members all proxy through to the
+ * `FlutterEngine` attached FlutterViewController.
*
- * A FlutterViewController can be initialized either with an already-running `FlutterEngine`,
- * or it can be initialized with a `FlutterDartProject` that will be used to spin up
- * a new `FlutterEngine`. Developers looking to present and hide FlutterViewControllers
- * in native iOS applications will usually want to maintain the `FlutterEngine` instance
- * so as not to lose Dart-related state and asynchronous tasks when navigating back and
- * forth between a FlutterViewController and other `UIViewController`s.
+ * A FlutterViewController can be initialized either with an already-running `FlutterEngine` via
+ * the `initWithEngine:` initializer, or it can be initialized with a `FlutterDartProject` that
+ * will be used to implicitly spin up a new `FlutterEngine`. Creating a `FlutterEngine before
+ * showing a `FlutterViewController` can be used to pre-initialize the Dart VM and to prepare the
+ * isolate in order to reduce the latency to the first rendered frame. Holding a `FlutterEngine`
+ * independently of FlutterViewControllers can also be used to not to lose Dart-related state and
+ * asynchronous tasks when navigating back and forth between a FlutterViewController and other
+ * `UIViewController`s.
*/
FLUTTER_EXPORT
-@interface FlutterViewController
- : UIViewController
+@interface FlutterViewController : UIViewController
/**
* Initializes this FlutterViewController with the specified `FlutterEngine`.
@@ -110,7 +120,7 @@ FLUTTER_EXPORT
/**
* Instructs the Flutter Navigator (if any) to push a route on to the navigation
- * stack. The setInitialRoute method should be prefered if this is called before the
+ * stack. The setInitialRoute method should be preferred if this is called before the
* FlutterViewController has come into view.
*
* @param route The name of the route to push to the navigation stack.
@@ -122,6 +132,14 @@ FLUTTER_EXPORT
*/
- (id)pluginRegistry;
+/**
+ * True if at least one frame has rendered and the ViewController has appeared.
+ *
+ * This property is reset to false when the ViewController disappears. It is
+ * guaranteed to only alternate between true and false for observers.
+ */
+@property(nonatomic, readonly, getter=isDisplayingFlutterUI) BOOL displayingFlutterUI;
+
/**
* Specifies the view to use as a splash screen. Flutter's rendering is asynchronous, so the first
* frame rendered by the Flutter application might not immediately appear when theFlutter view is
@@ -151,6 +169,19 @@ FLUTTER_EXPORT
*/
@property(nonatomic, getter=isViewOpaque) BOOL viewOpaque;
+/**
+ * The `FlutterEngine` instance for this view controller.
+ */
+@property(weak, nonatomic, readonly) FlutterEngine* engine;
+
+/**
+ * The `FlutterBinaryMessenger` associated with this FlutterViewController (used for communicating
+ * with channels).
+ *
+ * This is just a convenient way to get the |FlutterEngine|'s binary messenger.
+ */
+@property(nonatomic, readonly) NSObject* binaryMessenger;
+
@end
#endif // FLUTTER_FLUTTERVIEWCONTROLLER_H_
diff --git a/example/ios/Flutter/Flutter.framework/Info.plist b/example/ios/Flutter/Flutter.framework/Info.plist
index b3b0256..18c2eef 100644
--- a/example/ios/Flutter/Flutter.framework/Info.plist
+++ b/example/ios/Flutter/Flutter.framework/Info.plist
@@ -22,5 +22,9 @@
1.0
MinimumOSVersion
8.0
+ FlutterEngine
+ 72283b64196cb5df16eb4d1a782da08f320a8014
+ ClangVersion
+ Fuchsia clang version 8.0.0 (based on LLVM 8.0.0svn)
diff --git a/example/ios/Flutter/Generated.xcconfig b/example/ios/Flutter/Generated.xcconfig
index 6bd4425..f602f43 100644
--- a/example/ios/Flutter/Generated.xcconfig
+++ b/example/ios/Flutter/Generated.xcconfig
@@ -1,9 +1,9 @@
// This is a generated file; do not edit or check into version control.
-FLUTTER_ROOT=/Users/tangdev/development/flutter
-FLUTTER_APPLICATION_PATH=/Users/tangdev/GitLab/FlutterLibs/flutter-auth0/example
-FLUTTER_TARGET=lib/main.dart
+FLUTTER_ROOT=/Users/dennysegura/development/flutter
+FLUTTER_APPLICATION_PATH=/Users/dennysegura/Dev/Libs/flutter/flutter-auth0/example
+FLUTTER_TARGET=/Users/dennysegura/Dev/Libs/flutter/flutter-auth0/example/lib/main.dart
FLUTTER_BUILD_DIR=build
SYMROOT=${SOURCE_ROOT}/../build/ios
-FLUTTER_FRAMEWORK_DIR=/Users/tangdev/development/flutter/bin/cache/artifacts/engine/ios
+FLUTTER_FRAMEWORK_DIR=/Users/dennysegura/development/flutter/bin/cache/artifacts/engine/ios
FLUTTER_BUILD_NAME=1.0.0
FLUTTER_BUILD_NUMBER=1
diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh
new file mode 100755
index 0000000..3deba50
--- /dev/null
+++ b/example/ios/Flutter/flutter_export_environment.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+# This is a generated file; do not edit or check into version control.
+export "FLUTTER_ROOT=/Users/dennysegura/development/flutter"
+export "FLUTTER_APPLICATION_PATH=/Users/dennysegura/Dev/Libs/flutter/flutter-auth0/example"
+export "FLUTTER_TARGET=/Users/dennysegura/Dev/Libs/flutter/flutter-auth0/example/lib/main.dart"
+export "FLUTTER_BUILD_DIR=build"
+export "SYMROOT=${SOURCE_ROOT}/../build/ios"
+export "FLUTTER_FRAMEWORK_DIR=/Users/dennysegura/development/flutter/bin/cache/artifacts/engine/ios"
+export "FLUTTER_BUILD_NAME=1.0.0"
+export "FLUTTER_BUILD_NUMBER=1"
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
index 6f6494a..18a0335 100644
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/example/ios/Runner.xcodeproj/project.pbxproj
@@ -8,7 +8,6 @@
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
- 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -41,13 +40,13 @@
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
- 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; };
7648F1AD5A8C5811CF401A51 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ 9109DFAB36171D49417A94BA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; };
@@ -57,6 +56,7 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ A843F6C611DD00D1D51A9E95 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -76,7 +76,6 @@
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
- 2D5378251FAA1A9400D5DBA9 /* flutter_assets */,
3B80C3931E831B6300D905FE /* App.framework */,
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEBA1CF902C7004384FC /* Flutter.framework */,
@@ -141,6 +140,8 @@
ACE948806EDF57424795D7DA /* Pods */ = {
isa = PBXGroup;
children = (
+ 9109DFAB36171D49417A94BA /* Pods-Runner.debug.xcconfig */,
+ A843F6C611DD00D1D51A9E95 /* Pods-Runner.release.xcconfig */,
);
name = Pods;
sourceTree = "";
@@ -211,7 +212,6 @@
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
- 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -274,21 +274,17 @@
buildActionMask = 2147483647;
files = (
);
- inputFileListPaths = (
- );
inputPaths = (
- "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
"${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework",
);
name = "[CP] Embed Pods Frameworks";
- outputFileListPaths = (
- );
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
diff --git a/example/lib/demo.dart b/example/lib/demo.dart
new file mode 100644
index 0000000..36077b0
--- /dev/null
+++ b/example/lib/demo.dart
@@ -0,0 +1,95 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_auth0/flutter_auth0.dart';
+
+import 'pkce.dart';
+import 'standard.dart';
+
+final String clientId = 'XIpuO0OchFaayJZRq8RvpQefOdfJkgSL';
+final String domain = 'dennysegura.auth0.com';
+
+class MyHomePage extends StatefulWidget {
+ MyHomePage({Key key, this.title}) : super(key: key);
+
+ final String title;
+
+ @override
+ _MyHomePageState createState() => _MyHomePageState();
+}
+
+class _MyHomePageState extends State
+ with SingleTickerProviderStateMixin {
+ TabController controller;
+ Auth0 auth;
+ final GlobalKey skey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ controller = TabController(vsync: this, initialIndex: 0, length: 2);
+ auth = Auth0(baseUrl: 'https://$domain/', clientId: clientId);
+ }
+
+ void showInfo(String text, String message) {
+ showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ title: Text(text),
+ content: Text(message),
+ actions: [
+ FlatButton(
+ child: Text("Close"),
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ ),
+ ],
+ );
+ },
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ key: skey,
+ appBar: AppBar(
+ elevation: 0.7,
+ centerTitle: false,
+ leading: Image.network(
+ 'https://cdn.auth0.com/styleguide/components/1.0.8/media/logos/img/logo-grey.png',
+ height: 40,
+ ),
+ backgroundColor: Color.fromRGBO(0, 0, 0, 1.0),
+ title: Text(widget.title),
+ bottom: TabBar(
+ controller: controller,
+ indicatorColor: Colors.white,
+ tabs: [
+ Tab(
+ text: 'PKCE Flow',
+ ),
+ Tab(
+ text: 'Standard Flow',
+ )
+ ],
+ ),
+ ),
+ body: LayoutBuilder(
+ builder: (ctx, constraints) {
+ return Container(
+ constraints: constraints,
+ color: Colors.white,
+ child: TabBarView(
+ controller: controller,
+ children: [
+ PKCEPage(auth, showInfo),
+ StandardPage(auth, showInfo),
+ ],
+ ),
+ );
+ },
+ ),
+ );
+ }
+}
diff --git a/example/lib/main.dart b/example/lib/main.dart
index 79a2b86..c96db5d 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -1,16 +1,14 @@
import 'dart:async';
import 'package:flutter/material.dart';
-import 'package:flutter_auth0/flutter_auth0.dart';
-
-final String clientId = 'your-client-id';
-final String domain = 'your-domain';
-
-final Auth0 auth = new Auth0(clientId: clientId, domain: domain);
-final WebAuth web = new WebAuth(clientId: clientId, domain: domain);
-
-void main() {
- runApp(MyApp());
+import 'demo.dart';
+
+void main() async {
+ runZoned>(() async {
+ runApp(MyApp());
+ }, onError: (error, stackTrace) async {
+ debugPrint(error.toString());
+ });
}
class MyApp extends StatelessWidget {
@@ -22,204 +20,3 @@ class MyApp extends StatelessWidget {
);
}
}
-
-class MyHomePage extends StatefulWidget {
- MyHomePage({Key key, this.title}) : super(key: key);
-
- final String title;
-
- @override
- _MyHomePageState createState() => _MyHomePageState();
-}
-
-class _MyHomePageState extends State {
- final GlobalKey skey = GlobalKey();
- Future _message = Future.value('');
- TextEditingController usernameController = TextEditingController();
- TextEditingController passwordController = TextEditingController();
- String refreshToken;
- String wRefreshToken;
-
- Future _signUp() async {
- dynamic user = await auth.createUser(
- email: usernameController.text,
- password: passwordController.text,
- connection: 'Username-Password-Authentication',
- waitResponse: true);
- return '''[Sign-Up Success]
- User Id: ${user['_id']}''';
- }
-
- Future _signIn() async {
- Auth0User user = await auth.passwordRealm(
- username: usernameController.text,
- password: passwordController.text,
- realm: 'Username-Password-Authentication');
- return '''[Sign-In Success]
- Access Token: ${user.accessToken}''';
- }
-
- Future _delegationToken() async {
- Auth0User user = await auth.passwordRealm(
- username: usernameController.text,
- password: passwordController.text,
- realm: 'Username-Password-Authentication');
- String token = await auth.delegate(token: user.idToken, api: 'firebase');
- return '''[Delegation Token Success]
- Access Token: $token''';
- }
-
- Future _userInfo() async {
- Auth0User user = await auth.passwordRealm(
- username: usernameController.text,
- password: passwordController.text,
- realm: 'Username-Password-Authentication');
- dynamic response = await auth.userInfo(token: user.accessToken);
- StringBuffer buffer = new StringBuffer();
- response.forEach((k, v) => buffer.writeln('$k: $v'));
- return '''[User Info]
- ${buffer.toString()}''';
- }
-
- Future _resetPassword() async {
- dynamic success = await auth.resetPassword(
- email: usernameController.text,
- connection: 'Username-Password-Authentication');
- return success ? 'Password Reset Success' : 'Password Reset Fail';
- }
-
- void assignFuture(Function func) {
- setState(() {
- _message = func();
- });
- }
-
- void webLogin() {
- web
- .authorize(
- audience: 'https://$domain/userinfo',
- scope: 'openid email offline_access',
- )
- .then((value) {
- print('response: $value');
- wRefreshToken = value['refresh_token'];
- }).catchError((err) => print('Error: $err'));
- }
-
- void webRefreshToken() {
- if (wRefreshToken == null) {
- skey.currentState.showSnackBar(SnackBar(
- content: Text('Invalid Refresh Token'),
- ));
- return;
- }
- web
- .refreshToken(refreshToken: wRefreshToken)
- .then((value) => print('response: $value'))
- .catchError((err) => print('Error: $err'));
- }
-
- void closeSessions() {
- web.clearSession().catchError((err) => print(err));
- }
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- key: skey,
- appBar: AppBar(
- leading: Image.network(
- 'https://cdn.auth0.com/styleguide/components/1.0.8/media/logos/img/logo-grey.png',
- height: 40),
- backgroundColor: Color.fromRGBO(0, 0, 0, 1.0),
- title: Text(widget.title),
- ),
- body: Padding(
- padding: EdgeInsets.symmetric(horizontal: 16.0),
- child: SingleChildScrollView(
- controller: ScrollController(),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- TextField(
- controller: usernameController,
- decoration: const InputDecoration(
- hintText: 'Email/Username',
- ),
- ),
- TextField(
- controller: passwordController,
- obscureText: true,
- decoration: const InputDecoration(
- hintText: 'Password',
- ),
- ),
- MaterialButton(
- child: const Text('Test Sign Up'),
- color: Colors.blueAccent,
- textColor: Colors.white,
- onPressed: () {
- if (usernameController.text != null &&
- passwordController.text != null)
- assignFuture(this._signUp);
- }),
- MaterialButton(
- child: const Text('Test Sign In'),
- color: Colors.redAccent,
- textColor: Colors.white,
- onPressed: () {
- if (usernameController.text != null &&
- passwordController.text != null)
- assignFuture(this._signIn);
- }),
- MaterialButton(
- color: Colors.black,
- textColor: Colors.white,
- child: const Text('Test Delegation Token'),
- onPressed: () {
- if (usernameController.text != null &&
- passwordController.text != null)
- assignFuture(this._delegationToken);
- }),
- MaterialButton(
- color: Colors.indigo,
- textColor: Colors.white,
- child: const Text('Test User Info'),
- onPressed: () {
- if (usernameController.text != null &&
- passwordController.text != null)
- assignFuture(this._userInfo);
- }),
- MaterialButton(
- color: Colors.greenAccent,
- child: const Text('Test Reset Password'),
- onPressed: () {
- if (usernameController.text != null)
- assignFuture(this._resetPassword);
- }),
- MaterialButton(
- color: Colors.lightBlueAccent,
- child: const Text('Test Web Login'),
- onPressed: webLogin),
- MaterialButton(
- color: Colors.blueAccent,
- textColor: Colors.white,
- child: const Text('Test Web Refresh Token'),
- onPressed: webRefreshToken),
- MaterialButton(
- color: Colors.redAccent,
- child: const Text('Test Clear Sessions'),
- onPressed: closeSessions),
- FutureBuilder(
- future: _message,
- builder: (_, AsyncSnapshot snapshot) {
- return Text(snapshot.data ?? '',
- style: const TextStyle(color: Colors.black));
- }),
- ],
- ),
- ),
- ),
- );
- }
-}
diff --git a/example/lib/pkce.dart b/example/lib/pkce.dart
new file mode 100644
index 0000000..f76c25b
--- /dev/null
+++ b/example/lib/pkce.dart
@@ -0,0 +1,106 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_auth0/flutter_auth0.dart';
+
+class PKCEPage extends StatefulWidget {
+ final auth;
+ final Function showInfo;
+ const PKCEPage(this.auth, this.showInfo);
+ @override
+ _PKCEPageState createState() => _PKCEPageState();
+}
+
+class _PKCEPageState extends State {
+ bool webLogged;
+ dynamic currentWebAuth;
+
+ @override
+ void initState() {
+ super.initState();
+ webLogged = false;
+ }
+
+ Auth0 get auth {
+ return widget.auth;
+ }
+
+ Function get showInfo {
+ return widget.showInfo;
+ }
+
+ void webLogin() async {
+ try {
+ var response = await auth.webAuth.authorize({
+ 'audience': 'https://${auth.auth.client.domain}/userinfo',
+ 'scope': 'openid email offline_access',
+ });
+ DateTime now = DateTime.now();
+ showInfo('Web Login', '''
+ \ntoken_type: ${response['token_type']}
+ \nexpires_in: ${DateTime.fromMillisecondsSinceEpoch(response['expires_in'] + now.millisecondsSinceEpoch)}
+ \nrefreshToken: ${response['refresh_token']}
+ \naccess_token: ${response['access_token']}
+ ''');
+ webLogged = true;
+ currentWebAuth = Map.from(response);
+ setState(() {});
+ } catch (e) {
+ print('Error: $e');
+ }
+ }
+
+ void webRefreshToken() async {
+ try {
+ var response = await auth.webAuth.client.refreshToken({
+ 'refreshToken': currentWebAuth['refresh_token'],
+ });
+ DateTime now = DateTime.now();
+ showInfo('Refresh Token', '''
+ \ntoken_type: ${response['token_type']}
+ \nexpires_in: ${DateTime.fromMillisecondsSinceEpoch(response['expires_in'] + now.millisecondsSinceEpoch)}
+ \naccess_token: ${response['access_token']}
+ ''');
+ } catch (e) {
+ print('Error: $e');
+ }
+ }
+
+ void closeSessions() async {
+ try {
+ await auth.webAuth.clearSession();
+ webLogged = false;
+ setState(() {});
+ } catch (e) {
+ print('Error: $e');
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ padding: EdgeInsets.symmetric(horizontal: 16.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ MaterialButton(
+ color: Colors.lightBlueAccent,
+ textColor: Colors.white,
+ child: const Text('Test Login'),
+ onPressed: !webLogged ? webLogin : null,
+ ),
+ MaterialButton(
+ color: Colors.blueAccent,
+ textColor: Colors.white,
+ child: const Text('Test Refresh Token'),
+ onPressed: webLogged ? webRefreshToken : null,
+ ),
+ MaterialButton(
+ color: Colors.redAccent,
+ textColor: Colors.white,
+ child: const Text('Test Clear Sessions'),
+ onPressed: webLogged ? closeSessions : null,
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/example/lib/standard.dart b/example/lib/standard.dart
new file mode 100644
index 0000000..c5ab194
--- /dev/null
+++ b/example/lib/standard.dart
@@ -0,0 +1,157 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_auth0/flutter_auth0.dart';
+
+class StandardPage extends StatefulWidget {
+ final auth;
+ final Function showInfo;
+ const StandardPage(this.auth, this.showInfo);
+ @override
+ _StandardPageState createState() => _StandardPageState();
+}
+
+class _StandardPageState extends State {
+ bool logged;
+ dynamic currentAuth;
+ TextEditingController uctrl;
+ TextEditingController pctrl;
+
+ @override
+ void initState() {
+ super.initState();
+ logged = false;
+ uctrl = TextEditingController();
+ pctrl = TextEditingController();
+ }
+
+ Auth0 get auth {
+ return widget.auth;
+ }
+
+ Function get showInfo {
+ return widget.showInfo;
+ }
+
+ void _signUp() async {
+ try {
+ var response = await auth.auth.createUser({
+ 'email': uctrl.text,
+ 'password': pctrl.text,
+ 'connection': 'Username-Password-Authentication'
+ });
+ showInfo('Sign Up', '''
+ \nid: ${response['_id']}
+ \nusername/email: ${response['email']}
+ ''');
+ } catch (e) {
+ print(e);
+ }
+ }
+
+ void _signIn() async {
+ try {
+ var response = await auth.auth.passwordRealm({
+ 'username': uctrl.text,
+ 'password': pctrl.text,
+ 'realm': 'Username-Password-Authentication'
+ });
+ showInfo('Sign In', '''
+ \nAccess Token: ${response['access_token']}
+ ''');
+ } catch (e) {
+ print(e);
+ }
+ }
+
+ void _userInfo() async {
+ try {
+ var response = await auth.auth.passwordRealm({
+ 'username': uctrl.text,
+ 'password': pctrl.text,
+ 'realm': 'Username-Password-Authentication'
+ });
+ Auth0Auth authClient = Auth0Auth(
+ auth.auth.clientId, auth.auth.client.baseUrl,
+ bearer: response['access_token']);
+ var info = await authClient.getUserInfo();
+ String buffer = '';
+ info.forEach((k, v) => buffer = '$buffer\n$k: $v');
+ showInfo('User Info', buffer);
+ } catch (e) {
+ print(e);
+ }
+ }
+
+ void _resetPassword() async {
+ try {
+ var success = await auth.auth.resetPassword({
+ 'email': uctrl.text,
+ 'connection': 'Username-Password-Authentication'
+ });
+ showInfo('Reset Password', 'Password Restarted: $success');
+ } catch (e) {
+ print(e);
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ bool canSignIn = (uctrl.text != null &&
+ pctrl.text != null &&
+ uctrl.text.isNotEmpty &&
+ pctrl.text.isNotEmpty);
+ return Container(
+ padding: EdgeInsets.symmetric(horizontal: 16.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ TextField(
+ enabled: !logged,
+ controller: uctrl,
+ decoration: const InputDecoration(
+ hintText: 'Email/Username',
+ ),
+ onChanged: (e) {
+ setState(() {});
+ },
+ ),
+ TextField(
+ enabled: !logged,
+ controller: pctrl,
+ obscureText: true,
+ decoration: const InputDecoration(
+ hintText: 'Password',
+ ),
+ onChanged: (e) {
+ setState(() {});
+ },
+ ),
+ MaterialButton(
+ child: const Text('Test Sign Up'),
+ color: Colors.blueAccent,
+ textColor: Colors.white,
+ onPressed: canSignIn ? _signUp : null,
+ ),
+ MaterialButton(
+ child: const Text('Test Sign In'),
+ color: Colors.redAccent,
+ textColor: Colors.white,
+ onPressed: canSignIn && !logged ? _signIn : null,
+ ),
+ MaterialButton(
+ color: Colors.indigo,
+ textColor: Colors.white,
+ child: const Text('Test User Info'),
+ onPressed: canSignIn ? _userInfo : null,
+ ),
+ MaterialButton(
+ color: Colors.greenAccent,
+ child: const Text('Test Reset Password'),
+ onPressed: uctrl.text != null && uctrl.text.isNotEmpty
+ ? _resetPassword
+ : null,
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/example/pubspec.lock b/example/pubspec.lock
index c790409..73229c8 100644
--- a/example/pubspec.lock
+++ b/example/pubspec.lock
@@ -1,20 +1,34 @@
# Generated by pub
-# See https://www.dartlang.org/tools/pub/glossary#lockfile
+# See https://dart.dev/tools/pub/glossary#lockfile
packages:
+ archive:
+ dependency: transitive
+ description:
+ name: archive
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.11"
+ args:
+ dependency: transitive
+ description:
+ name: args
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.5.2"
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.8"
+ version: "2.4.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.4"
+ version: "1.0.5"
charcode:
dependency: transitive
description:
@@ -29,6 +43,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.14.11"
+ convert:
+ dependency: transitive
+ description:
+ name: convert
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.1"
+ crypto:
+ dependency: transitive
+ description:
+ name: crypto
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.3"
cupertino_icons:
dependency: "direct main"
description:
@@ -47,7 +75,7 @@ packages:
path: ".."
relative: true
source: path
- version: "0.1.0"
+ version: "0.5.0"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -59,7 +87,7 @@ packages:
name: http
url: "https://pub.dartlang.org"
source: hosted
- version: "0.12.0"
+ version: "0.12.0+2"
http_parser:
dependency: transitive
description:
@@ -67,34 +95,55 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.3"
+ image:
+ dependency: transitive
+ description:
+ name: image
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.4"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
- version: "0.12.3+1"
+ version: "0.12.6"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.6"
+ version: "1.1.8"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
- version: "1.6.2"
+ version: "1.6.4"
+ pedantic:
+ dependency: transitive
+ description:
+ name: pedantic
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.8.0+1"
+ petitparser:
+ dependency: transitive
+ description:
+ name: petitparser
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.4.0"
quiver:
dependency: transitive
description:
name: quiver
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.1"
+ version: "2.0.5"
sky_engine:
dependency: transitive
description: flutter
@@ -106,7 +155,7 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
- version: "1.4.1"
+ version: "1.5.5"
stack_trace:
dependency: transitive
description:
@@ -120,28 +169,28 @@ packages:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
- version: "1.6.8"
+ version: "2.0.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.4"
+ version: "1.0.5"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.1"
+ version: "1.1.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
- version: "0.2.1"
+ version: "0.2.11"
typed_data:
dependency: transitive
description:
@@ -156,6 +205,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.8"
+ xml:
+ dependency: transitive
+ description:
+ name: xml
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "3.5.0"
sdks:
- dart: ">=2.0.0 <3.0.0"
- flutter: ">=0.1.4 <2.0.0"
+ dart: ">=2.4.0 <3.0.0"
+ flutter: ">=1.10.0 <2.0.0"
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
index 435caf6..fdcaf23 100644
--- a/example/pubspec.yaml
+++ b/example/pubspec.yaml
@@ -4,7 +4,7 @@ description: A new Flutter project.
version: 1.0.0+1
environment:
- sdk: ">=2.0.0-dev.68.0 <3.0.0"
+ sdk: ">=2.2.0 <3.0.0"
dependencies:
flutter:
diff --git a/ios/Classes/FlutterAuth0Plugin.m b/ios/Classes/FlutterAuth0Plugin.m
index 8210c96..8c1150f 100644
--- a/ios/Classes/FlutterAuth0Plugin.m
+++ b/ios/Classes/FlutterAuth0Plugin.m
@@ -46,7 +46,7 @@ @implementation FlutterAuth0Plugin
+ (void)registerWithRegistrar:(NSObject*)registrar {
FlutterMethodChannel* channel = [FlutterMethodChannel
- methodChannelWithName:@"plugins.flutter.io/auth0"
+ methodChannelWithName:@"io.flutter.plugins/auth0"
binaryMessenger:[registrar messenger]];
FlutterAuth0Plugin* instance = [[FlutterAuth0Plugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
@@ -54,9 +54,9 @@ + (void)registerWithRegistrar:(NSObject*)registrar {
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
if ([@"getPlatformVersion" isEqualToString:call.method]) {
result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
- } else if ([@"showUrl" isEqualToString:call.method]) {
- NSString *url = call.arguments[@"url"];
- BOOL closeOnLoad = call.arguments[@"closeOnLoad"];
+ } else if ([@"authorize" isEqualToString:call.method]) {
+ NSString *url = call.arguments;
+ BOOL closeOnLoad = false;
[self presentSafariWithURL:url result:result];
self.closeOnLoad = closeOnLoad;
} else if ([@"parameters" isEqualToString:call.method]) {
@@ -83,7 +83,7 @@ - (BOOL)canLaunchURL:(NSString *)urlString {
#pragma mark - Internal methods
- (void)presentSafariWithURL:(NSString *)urlString result:(FlutterResult)result {
- if(@([self canLaunchURL:urlString])){
+ if((BOOL)@([self canLaunchURL:urlString])){
NSURL *url = [NSURL URLWithString:urlString];
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
SFSafariViewController *controller = [[SFSafariViewController alloc] initWithURL:url];
@@ -183,4 +183,4 @@ - (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)
}
}
-@end
+@end
\ No newline at end of file
diff --git a/lib/flutter_auth0.dart b/lib/flutter_auth0.dart
index 3b033c5..82881f0 100644
--- a/lib/flutter_auth0.dart
+++ b/lib/flutter_auth0.dart
@@ -3,14 +3,40 @@ library auth0_auth;
import 'dart:async';
import 'dart:convert';
import 'dart:io';
+
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
-import 'package:meta/meta.dart';
part 'src/auth_exeption.dart';
-part 'src/auth_metadata.dart';
-part 'src/auth_provider.dart';
part 'src/auth0_error.dart';
part 'src/user_info.dart';
-part 'src/api_auth.dart';
-part 'src/web_auth.dart';
\ No newline at end of file
+part 'src/auth/index.dart';
+part 'src/webauth/index.dart';
+part 'src/networking/client.dart';
+part 'src/networking/telemetry.dart';
+part 'src/management/users.dart';
+
+class Auth0 {
+ final Auth0Auth auth;
+ final WebAuth webAuth;
+ final dynamic options;
+
+ Auth0._(this.auth, this.webAuth, this.options);
+
+ factory Auth0({String baseUrl, String clientId}) {
+ assert(baseUrl != null && clientId != null);
+ final auth = Auth0Auth(clientId, baseUrl);
+ final webAuth = new WebAuth(auth);
+ return Auth0._(auth, webAuth, {'baseUrl': baseUrl, 'clientId': clientId});
+ }
+
+ /*
+ * Creates a Users API client
+ * https://manage.auth0.com/#/apis/management/explorer
+ * @param {String} token for Management API
+ * @return {Users}
+ */
+ Users users(String token) {
+ return Users(Map.from(this.options)..addAll({'token': token}));
+ }
+}
diff --git a/lib/src/api_auth.dart b/lib/src/api_auth.dart
deleted file mode 100644
index 78d03c6..0000000
--- a/lib/src/api_auth.dart
+++ /dev/null
@@ -1,111 +0,0 @@
-part of auth0_auth;
-
-/*
- * Auth0 Auth API
- *
- * @see https://auth0.com/docs/api/authentication
- * @class Auth0
- */
-class Auth0 {
- final String clientId;
- final String domain;
-
- Auth0({this.clientId, this.domain});
-
- /*
- * Performs Auth with user credentials using the Password Realm Grant
- *
- * @param {String} username user's username or email
- * @param {String} password user's password
- * @param {String} realm name of the Realm where to Auth (or connection name)
- * @param {String} audience identifier of Resource Server (RS) to be included as audience (aud claim) of the issued access token
- * @param {String} scope scopes requested for the issued tokens. e.g. `openid profile`
- * @returns {Auth0User}
- * @see https://auth0.com/docs/api-auth/grant/password#realm-support
- *
- * @memberof Auth
- */
- Future passwordRealm({
- @required String username,
- @required String password,
- @required String realm,
- String audience,
- String scope = 'openid email profile token id id_token offline_access',
- }) async {
- dynamic request = await http.post(
- Uri.encodeFull(Constant.passwordRealm(this.domain)),
- headers: Constant.headers,
- body: jsonEncode(
- {
- 'grant_type': 'http://auth0.com/oauth/grant-type/password-realm',
- 'realm': realm,
- 'username': username,
- 'password': password,
- 'audience': audience,
- 'scope': scope,
- 'client_id': this.clientId
- },
- ),
- );
- Map response = await jsonDecode(request.body);
- return Auth0User.fromMap(response);
- }
-
- Future userInfo({
- @required String token,
- }) =>
- getUserInfo(
- this.domain,
- token: token,
- );
-
- Future resetPassword({
- @required String email,
- @required String connection,
- }) =>
- restorePassword(
- this.clientId,
- this.domain,
- email: email,
- connection: connection,
- );
-
- Future delegate({
- @required String token,
- @required String api,
- }) =>
- delegateToken(
- this.clientId,
- this.domain,
- token: token,
- api: api,
- );
-
- Future createUser({
- @required String email,
- @required String password,
- @required String connection,
- String username,
- String metadata,
- bool waitResponse = false,
- }) =>
- newUser(
- this.clientId,
- this.domain,
- email: email,
- password: password,
- connection: connection,
- username: username,
- metadata: metadata,
- waitResponse: waitResponse,
- );
-
- Future refreshToken({
- @required String refreshToken,
- }) =>
- refresh(
- this.clientId,
- this.domain,
- refreshToken: refreshToken,
- );
-}
diff --git a/lib/src/auth/index.dart b/lib/src/auth/index.dart
new file mode 100644
index 0000000..cf3b50d
--- /dev/null
+++ b/lib/src/auth/index.dart
@@ -0,0 +1,266 @@
+part of auth0_auth;
+
+class Auth0Auth {
+ final Auth0Client client;
+ final String clientId;
+
+ Auth0Auth._(this.client, this.clientId);
+
+ factory Auth0Auth(String clientId, String url, {dynamic bearer}) {
+ assert(clientId != null);
+ final _client = new Auth0Client(url, telemetry: telemetry, token: bearer);
+ return Auth0Auth._(_client, clientId);
+ }
+
+ Future responseHandler(http.Response response) {
+ if (response.statusCode == 200) {
+ return jsonDecode(response.body);
+ }
+ else if (response.statusCode == 401) {
+ throw Auth0Exeption(description: response.body);
+ }
+ throw jsonDecode(response.body);
+ }
+
+ Future