diff --git a/.github/_old-maven-deploy.yml b/.github/_old-maven-deploy.yml deleted file mode 100644 index f765ecc..0000000 --- a/.github/_old-maven-deploy.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Maven Deploy -on: - push: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Build - run: mvn -B package --file pom.xml - - name: Deploy to JavaWebStack Repository - run: mvn deploy -s build/settings.xml - env: - DEPLOYMENT_USERNAME: ${{ secrets.DEPLOYMENT_USERNAME }} - DEPLOYMENT_PASSWORD: ${{ secrets.DEPLOYMENT_PASSWORD }} \ No newline at end of file diff --git a/.github/workflows/maven-deploy-release.yml b/.github/workflows/maven-deploy-release.yml index ed702c9..dcb35bf 100644 --- a/.github/workflows/maven-deploy-release.yml +++ b/.github/workflows/maven-deploy-release.yml @@ -6,18 +6,6 @@ on: jobs: build: runs-on: ubuntu-latest - services: - mysql: - image: mariadb:latest - env: - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: test - MYSQL_USER: test - MYSQL_PASSWORD: test - MYSQL_RANDOM_ROOT_PASSWORD: yes - ports: - - 3306 - options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 steps: - uses: actions/checkout@v2 - name: Set up JDK 1.8 @@ -28,10 +16,6 @@ jobs: run: mvn -B -DbuildVersion=${{ github.event.release.tag_name }} package -Dmaven.test.skip=true - name: Test run: mvn -B test - env: - MYSQL_PORT: ${{ job.services.mysql.ports[3306] }} - MYSQL_USERNAME: test - MYSQL_PASSWORD: test - name: Install GPG Key run: echo -e "$GPG_PRIVATE_KEY" | gpg --import --no-tty --batch --yes env: @@ -39,7 +23,5 @@ jobs: - name: Deploy to JavaWebStack Repository run: mvn deploy -B -DbuildVersion=${{ github.event.release.tag_name }} -s build/settings.xml -Dmaven.test.skip=true env: - DEPLOYMENT_USERNAME: ${{ secrets.DEPLOYMENT_USERNAME }} - DEPLOYMENT_PASSWORD: ${{ secrets.DEPLOYMENT_PASSWORD }} GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} diff --git a/.github/workflows/maven-snapshot-deploy.yml b/.github/workflows/maven-snapshot-deploy.yml new file mode 100644 index 0000000..9d20461 --- /dev/null +++ b/.github/workflows/maven-snapshot-deploy.yml @@ -0,0 +1,28 @@ +name: Maven Deploy +on: + push: + branches: + - dev + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build + run: mvn -B package -Dmaven.test.skip=true + - name: Test + run: mvn -B test + - name: Install GPG Key + run: echo -e "$GPG_PRIVATE_KEY" | gpg --import --no-tty --batch --yes + env: + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + - name: Deploy to JavaWebStack Repository + run: mvn deploy -B -s build/settings.xml -Dmaven.test.skip=true + env: + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index c5d6322..2fd06b8 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,6 @@ Passport is a JWS-Module which allows you to create easily Authentication in you ### Example usage ```java -import org.javawebstack.passport.services.oauth2.InteraAppsOAuth2Service; - class MyApp { /* ... */ protected void setup() { @@ -24,10 +22,11 @@ class MyApp { Passport passport = new Passport("/auth"); OAuth2Strategy oAuth2Strategy = new OAuth2Strategy("http://localhost:1234"); - oAuth2Strategy.setHttpCallbackHandler((e, callback) -> { + oAuth2Strategy.setHttpCallbackHandler((e, callback, name) -> { return "Hello " + callback.getProfile().getName(); }); + oAuth2Strategy.use("google", new GoogleOAuth2Provider("myid", "mysecret").setScopes("https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email")); oAuth2Strategy.use("interaapps", new InteraAppsOAuth2Provider("myid", "mysecret").setScopes("user:read")); passport.use("oauth2", oAuth2Strategy); @@ -38,7 +37,7 @@ class MyApp { // Creates Routes: /auth/oauth2/interaapps, /auth/oauth2/interaapps/callback } - + // JWS-Passport ships also an abstracted form of handling oauth2 public void oAuthWithoutHTTPServer() { OAuth2Strategy oAuth2Strategy = new OAuth2Strategy("http://localhost:1234"); @@ -47,10 +46,10 @@ class MyApp { // Redirect String callbackUrl = ".../callback"; String redirectUrl = oAuth2Strategy.get("interaapps").redirect(callbackUrl); - + // On callback OAuth2Callback callback = oAuth2Strategy.get("interaapps").callback(new AbstractObject().set("code", code), callbackUrl); - System.out.println("Hello "+callback.getProfile().name); + System.out.println("Hello " + callback.getProfile().name); } /* ... */ @@ -69,9 +68,9 @@ class MyApp { # Services Service|Class|Control-Panel|More Information ---|---|---|--- -Github|GithubOAuth2Service|[Github Developer Center](https://github.com/settings/developers)|- -Google|GoogleOAuth2Service|[Google Developer Console](https://console.developers.google.com/)|- -Discord|DiscordOAuth2Service|[Discord Developer Portal](https://discord.com/developers/applications)|- -Facebook|FacebookOAuth2Service|[Facebook Developer Center](https://console.developers.google.com/)|TODO -InteraApps|InteraAppsOAuth2Service|[IA-Accounts Developer Center](https://accounts.interaapps.de/developers/projects)|- -Twitch|TwitchOAuth2Service|[Twitch Developers](https://dev.twitch.tv/)|Implements the OAuth authorization code flow +Github|GithubOAuth2Provider|[Github Developer Center](https://github.com/settings/developers)|- +Google|GoogleOAuth2Provider|[Google Developer Console](https://console.developers.google.com/)|- +Discord|DiscordOAuth2Provider|[Discord Developer Portal](https://discord.com/developers/applications)|- +Facebook|FacebookOAuth2Provider|[Facebook Developer Center](https://console.developers.google.com/)|TODO +InteraApps|InteraAppsOAuth2Provider|[IA-Accounts Developer Center](https://accounts.interaapps.de/developers/projects)|- +Twitch|TwitchOAuth2Provider|[Twitch Developers](https://dev.twitch.tv/)|Implements the OAuth authorization code flow diff --git a/build/settings.xml b/build/settings.xml index 599032c..ba468f1 100644 --- a/build/settings.xml +++ b/build/settings.xml @@ -5,14 +5,13 @@ > - javawebstack-snapshots - ${env.DEPLOYMENT_USERNAME} - ${env.DEPLOYMENT_PASSWORD} + ossrh + JavaWebStack + ${env.OSSRH_PASSWORD} - javawebstack-releases - ${env.DEPLOYMENT_USERNAME} - ${env.DEPLOYMENT_PASSWORD} + gpg + ${env.GPG_PASSPHRASE} - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index 01cd41f..11f5381 100644 --- a/pom.xml +++ b/pom.xml @@ -4,12 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - Passport + passport Adds authentication with ease https://github.com/JavaWebStack/passport org.javawebstack - Passport + passport ${buildVersion} @@ -29,7 +29,7 @@ Julian Gojani julian@gojani.xyz - JavaWebStack + JavaWebStack https://javawebstack.org @@ -49,7 +49,7 @@ org.javawebstack http-server - 1.0.0 + 1.0.1 com.google.apis diff --git a/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Callback.java b/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Callback.java index 438f660..a40301b 100644 --- a/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Callback.java +++ b/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Callback.java @@ -5,8 +5,10 @@ public abstract class OAuth2Callback { protected String accessToken; protected String refreshToken; + protected OAuth2Provider provider; - public OAuth2Callback(String accessToken, String refreshToken) { + public OAuth2Callback(OAuth2Provider provider, String accessToken, String refreshToken) { + this.provider = provider; this.accessToken = accessToken; this.refreshToken = refreshToken; } @@ -22,4 +24,8 @@ public String getAccessToken() { public String getRefreshToken() { return refreshToken; } + + public OAuth2Provider getProvider() { + return provider; + } } diff --git a/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Provider.java b/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Provider.java index 379ccff..7ac8304 100644 --- a/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Provider.java +++ b/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Provider.java @@ -2,8 +2,7 @@ import org.javawebstack.abstractdata.AbstractObject; -public abstract class OAuth2Provider { - public abstract OAuth2Callback callback(AbstractObject queryParameters, String callbackUrl); - - public abstract String redirect(String callbackUrl); +public interface OAuth2Provider { + OAuth2Callback callback(AbstractObject queryParameters, String callbackUrl); + String redirect(String callbackUrl); } diff --git a/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Strategy.java b/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Strategy.java index 4726ed2..0372070 100644 --- a/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Strategy.java +++ b/src/main/java/org/javawebstack/passport/strategies/oauth2/OAuth2Strategy.java @@ -32,7 +32,7 @@ public void createRoutes(String prefixUrl, HTTPServer httpServer) { }); httpServer.get(callbackUrl, e -> { - return httpCallbackHandler.handle(e, oauth2.callback(e.getQueryParameters(), host+callbackUrl)); + return httpCallbackHandler.handle(e, oauth2.callback(e.getQueryParameters(), host+callbackUrl), name); }); }); } @@ -46,6 +46,6 @@ public void setHttpCallbackHandler(HttpCallbackHandler httpCallbackHandler) { } public interface HttpCallbackHandler { - Object handle(Exchange exchange, OAuth2Callback callback); + Object handle(Exchange exchange, OAuth2Callback callback, String provider); } } diff --git a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/DiscordOAuth2Provider.java b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/DiscordOAuth2Provider.java index a7bed3e..f5077d6 100644 --- a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/DiscordOAuth2Provider.java +++ b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/DiscordOAuth2Provider.java @@ -10,7 +10,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -public class DiscordOAuth2Provider extends OAuth2Provider { +public class DiscordOAuth2Provider implements OAuth2Provider { private String clientId; private String secret; private String[] scopes = {"email","identify"}; @@ -40,7 +40,7 @@ public OAuth2Callback callback(AbstractObject queryParameters, String callbackUr .toString() ) .data().object(); - return new OAuth2Callback(abstractObject.string("access_token"), abstractObject.string("refresh_token")); + return new OAuth2Callback(this, abstractObject.string("access_token"), abstractObject.string("refresh_token")); } public String redirect(String callbackUrl) { @@ -53,8 +53,8 @@ public String redirect(String callbackUrl) { } public static class OAuth2Callback extends org.javawebstack.passport.strategies.oauth2.OAuth2Callback { - public OAuth2Callback(String accessToken, String refreshToken) { - super(accessToken, refreshToken); + public OAuth2Callback(OAuth2Provider provider, String accessToken, String refreshToken) { + super(provider, accessToken, refreshToken); } public HTTPClient createApiClient() { diff --git a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/GitHubOAuth2Provider.java b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/GitHubOAuth2Provider.java index 5be7639..bd61f95 100644 --- a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/GitHubOAuth2Provider.java +++ b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/GitHubOAuth2Provider.java @@ -13,7 +13,7 @@ import java.util.Arrays; import java.util.List; -public class GitHubOAuth2Provider extends OAuth2Provider { +public class GitHubOAuth2Provider implements OAuth2Provider { private String clientId; private String secret; private String[] scopes = {"read:user","user:email"}; @@ -39,8 +39,7 @@ public OAuth2Callback callback(AbstractObject queryParameters, String callbackUr if (abstractObject.has("scope")/* && abstractObject.get("scope").string().equals("read:user,user:email")*/) { - System.out.println(abstractObject.toJsonString()); - return new OAuth2Callback(abstractObject.string("access_token"), abstractObject.has("refresh_token") ? abstractObject.string("refresh_token") : null); + return new OAuth2Callback(this, abstractObject.string("access_token"), abstractObject.has("refresh_token") ? abstractObject.string("refresh_token") : null); } return null; @@ -56,8 +55,8 @@ public String redirect(String callbackUrl) { } public static class OAuth2Callback extends org.javawebstack.passport.strategies.oauth2.OAuth2Callback { - public OAuth2Callback(String accessToken, String refreshToken) { - super(accessToken, refreshToken); + public OAuth2Callback(OAuth2Provider provider, String accessToken, String refreshToken) { + super(provider, accessToken, refreshToken); } public HTTPClient createApiClient() { diff --git a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/GoogleOAuth2Provider.java b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/GoogleOAuth2Provider.java index 6ae9e5a..3882a9f 100644 --- a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/GoogleOAuth2Provider.java +++ b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/GoogleOAuth2Provider.java @@ -17,7 +17,7 @@ import java.io.IOException; import java.util.Arrays; -public class GoogleOAuth2Provider extends OAuth2Provider { +public class GoogleOAuth2Provider implements OAuth2Provider { private String clientId; private String secret; private GoogleAuthorizationCodeFlow googleAuthorizationCodeFlow; @@ -51,7 +51,7 @@ public OAuth2Callback callback(AbstractObject queryParameters, String callbackUr GoogleTokenResponse code =googleAuthorizationCodeFlow.newTokenRequest(queryParameters.string("code")) .setRedirectUri(callbackUrl) .execute(); - return new OAuth2Callback(code.getAccessToken(), code.getRefreshToken(), clientId, secret); + return new OAuth2Callback(this, code.getAccessToken(), code.getRefreshToken(), clientId, secret); } catch (IOException e) { return null; } @@ -70,8 +70,8 @@ public static class OAuth2Callback extends org.javawebstack.passport.strategies. private String clientId; private String secret; - public OAuth2Callback(String accessToken, String refreshToken, String clientId, String secret) { - super(accessToken, refreshToken); + public OAuth2Callback(OAuth2Provider provider, String accessToken, String refreshToken, String clientId, String secret) { + super(provider, accessToken, refreshToken); this.clientId = clientId; this.secret = secret; } diff --git a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/InteraAppsOAuth2Provider.java b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/InteraAppsOAuth2Provider.java index 0544afc..83b7020 100644 --- a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/InteraAppsOAuth2Provider.java +++ b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/InteraAppsOAuth2Provider.java @@ -13,7 +13,7 @@ import java.util.Arrays; import java.util.List; -public class InteraAppsOAuth2Provider extends OAuth2Provider { +public class InteraAppsOAuth2Provider implements OAuth2Provider { private String clientId; private String secret; private String[] scopes = {"user:read"}; @@ -51,7 +51,7 @@ public OAuth2Callback callback(AbstractObject queryParameters, String callbackUr } if (data.get("success").bool()) { - return new OAuth2Callback(data.string("access_token"), data.string("refresh_token")); + return new OAuth2Callback(this, data.string("access_token"), data.string("refresh_token")); } return null; @@ -67,8 +67,8 @@ public String redirect(String callbackUrl) { } public static class OAuth2Callback extends org.javawebstack.passport.strategies.oauth2.OAuth2Callback { - public OAuth2Callback(String accessToken, String refreshToken) { - super(accessToken, refreshToken); + public OAuth2Callback(OAuth2Provider provider, String accessToken, String refreshToken) { + super(provider, accessToken, refreshToken); } public HTTPClient createApiClient() { @@ -91,5 +91,6 @@ public OAuth2Profile getProfile() { userData.forEach(profile::set); return profile; } + } } diff --git a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/TwitchOAuth2Provider.java b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/TwitchOAuth2Provider.java index 5cf327a..73d4bcd 100644 --- a/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/TwitchOAuth2Provider.java +++ b/src/main/java/org/javawebstack/passport/strategies/oauth2/providers/TwitchOAuth2Provider.java @@ -10,7 +10,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -public class TwitchOAuth2Provider extends OAuth2Provider { +public class TwitchOAuth2Provider implements OAuth2Provider { private String clientId; private String secret; private String[] scopes = {"user:read:email"}; // reference: https://dev.twitch.tv/docs/authentication/#scopes @@ -41,7 +41,7 @@ public OAuth2Callback callback(AbstractObject queryParameters, String callbackUr .data().object(); if (abstractObject.has("scope")) { - return new OAuth2Callback(abstractObject.string("access_token"), abstractObject.string("refresh_token"), clientId); + return new OAuth2Callback(this, abstractObject.string("access_token"), abstractObject.string("refresh_token"), clientId); } return null; @@ -77,8 +77,8 @@ public String redirect(String callbackUrl) { public static class OAuth2Callback extends org.javawebstack.passport.strategies.oauth2.OAuth2Callback { private String clientId; - public OAuth2Callback(String accessToken, String refreshToken, String clientId) { - super(accessToken, refreshToken); + public OAuth2Callback(OAuth2Provider provider, String accessToken, String refreshToken, String clientId) { + super(provider, accessToken, refreshToken); this.clientId = clientId; } @@ -106,4 +106,5 @@ public OAuth2Profile getProfile() { return profile; } } + }