From 21dc1f9a56b31f346765b799942b745e8f87773f Mon Sep 17 00:00:00 2001 From: Johan Dufour Date: Fri, 19 Apr 2019 18:56:52 +0200 Subject: [PATCH] feat(spotify-auth): add Spotify OAuth plugin (#2989) --- .../plugins/spotify-auth/index.ts | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/@ionic-native/plugins/spotify-auth/index.ts diff --git a/src/@ionic-native/plugins/spotify-auth/index.ts b/src/@ionic-native/plugins/spotify-auth/index.ts new file mode 100644 index 000000000..716104876 --- /dev/null +++ b/src/@ionic-native/plugins/spotify-auth/index.ts @@ -0,0 +1,139 @@ +import { Injectable } from '@angular/core'; +import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; + +/** + * OAuth configuration data. + */ +export interface Config { + /** The client ID as per the Spotify dev console. */ + clientId: string; + + /** The redirect URI as entered in the Spotify dev console. */ + redirectUrl: string; + + /** + * Safety margin time (in milliseconds) for the token refresh. + * + * The plugin applies a safety margin to the token lifetime in order + * to give the token user enough time to perform all operations needed. + * + * Otherwise the plugin might hand out a token that is already expired + * before it could ever be used. + * + * The safety margin defaults to 30s. + */ + refreshSafetyMargin?: number; + + /** Requested OAuth scopes. */ + scopes: string[]; + + /** The token exchange URL. */ + tokenExchangeUrl: string; + + /** The token refresh URL. */ + tokenRefreshUrl: string; +} + +/** + * The authorization data. + */ +export interface AuthorizationData { + /** A valid access token. */ + accessToken: string; + + /** The encrypted refresh token. */ + encryptedRefreshToken: string; + + /** The date (from UTC, in milliseconds) when the given access token expires. */ + expiresAt: number; +} + +/** + * @name Spotify Auth + * @description + * Cordova plugin for authenticating with Spotify + * > https://github.com/Festify/cordova-spotify-oauth + * + * @usage + * ```typescript + * import { SpotifyAuth } from '@ionic-native/spotify-auth'; + * + * // [...] + * + * constructor(private spotifyAuth: SpotifyAuth) { } + * + * // [...] + * + * const config = { + * clientId: "", + * redirectUrl: "", + * scopes: ["streaming"], // see Spotify Dev console for all scopes + * tokenExchangeUrl: "", + * tokenRefreshUrl: "", + * }; + * + * ... + * + * this.spotifyAuth.authorize(config) + * .then(({ accessToken, expiresAt }) => { + * console.log(`Got an access token, its ${accessToken}!`); + * console.log(`Its going to expire in ${expiresAt - Date.now()}ms.`); + * }); + * + * // [...] + * + * this.spotifyAuth.forget().then(() => console.log("We're logged out!")); + * + * // [...] + * ``` + */ +@Plugin({ + pluginName: 'SpotifyAuth', + plugin: 'cordova-spotify-oauth', + pluginRef: 'cordova.plugins.spotifyAuth', + repo: 'https://github.com/Festify/cordova-spotify-oauth', + install: 'ionic cordova plugin add cordova-spotify-oauth --variable LOCAL_STORAGE_KEY="SpotifyOAuthData"', + installVariables: ['LOCAL_STORAGE_KEY'], + platforms: ['Android', 'iOS'] +}) +@Injectable() +export class SpotifyAuth extends IonicNativePlugin { + /** + * Obtains valid authorization data. + * + * This method performs the necessary steps in order to obtain a valid + * access token. It performs the OAuth dance prompting the user to log in, + * exchanges the obtained authorization code for an access and a refresh + * token, caches those, and returns both to the developer. + * + * When it is invoked again, it will first check whether the cached access + * token is still valid (including a configurable safety margin) and the + * scopes equal, and return the token directly if that is the case. Otherwise, + * the method will transparently refresh the token (or obtain a new one if + * the scopes changed) and return that. + * + * Bottom line - always call this if you need a valid access token in your code. + * + * @param cfg {Config} configuration + * @return {Promise} + */ + @Cordova({ + sync: false + }) + authorize(cfg: Config): Promise { + return; + } + + /** + * Removes all cached data so that `authorize` performs the full + * oauth dance again. + * + * This is akin to a "logout". + * + * @return {void} + */ + @Cordova({ + sync: true + }) + forget(): void { } +}