diff --git a/dt-core/libraries/wp-api-jwt-auth/public/class-jwt-auth-public.php b/dt-core/libraries/wp-api-jwt-auth/public/class-jwt-auth-public.php index aaa2de1962..c4f06c3887 100644 --- a/dt-core/libraries/wp-api-jwt-auth/public/class-jwt-auth-public.php +++ b/dt-core/libraries/wp-api-jwt-auth/public/class-jwt-auth-public.php @@ -74,12 +74,22 @@ public function __construct( string $plugin_name, string $version ) { * Add the endpoints to the API */ public function add_api_routes() { + register_rest_route( $this->namespace, 'token', [ + 'methods' => 'GET', + 'callback' => [ $this, 'exchange_cookie_for_jwt' ], + 'permission_callback' => '__return_true', + ] ); register_rest_route( $this->namespace, 'token', [ 'methods' => 'POST', 'callback' => [ $this, 'generate_token' ], 'permission_callback' => '__return_true', ] ); - + register_rest_route( $this->namespace, 'token/refresh', [ + 'methods' => 'POST', + 'callback' => [ $this, 'refresh_access_token' ], + 'permission_callback' => '__return_true' + ] + ); register_rest_route( $this->namespace, 'token/validate', [ 'methods' => 'POST', 'callback' => [ $this, 'validate_token' ], @@ -146,54 +156,59 @@ public static function generate_token( WP_REST_Request $request ) { ); } - /** Valid credentials, the user exists create the according Token */ - $issuedAt = time(); - $notBefore = apply_filters( 'jwt_auth_not_before', $issuedAt, $issuedAt ); - $expire = apply_filters( 'jwt_auth_expire', $issuedAt + ( DAY_IN_SECONDS * 7 ), $issuedAt ); - - $token = [ - 'iss' => get_bloginfo( 'url' ), - 'iat' => $issuedAt, - 'nbf' => $notBefore, - 'exp' => $expire, - 'data' => [ - 'user' => [ - 'id' => $user->data->ID, - ], - ], - ]; - - /** Let the user modify the token data before the sign. */ - $algorithm = self::get_algorithm(); - - if ( $algorithm === false ) { - return new WP_Error( - 'jwt_auth_unsupported_algorithm', - __( 'Algorithm not supported, see https://www.rfc-editor.org/rfc/rfc7518#section-3', 'wp-api-jwt-auth' ), - [ - 'status' => 403, - ] - ); - } - - $token = JWT::encode( - apply_filters( 'jwt_auth_token_before_sign', $token, $user ), - $secret_key, - $algorithm - ); - - /** The token is signed, now create the object with no sensible user data to the client*/ - $data = [ - 'token' => $token, - 'user_email' => $user->data->user_email, - 'user_nicename' => $user->data->user_nicename, - 'user_display_name' => $user->data->display_name, - ]; + $data = self::generate_token_for_user( $user ); /** Let the user modify the data before send it back */ return apply_filters( 'jwt_auth_token_before_dispatch', $data, $user ); } + private static function generate_token_for_user( $user ){ + $secret_key = defined( 'JWT_AUTH_SECRET_KEY' ) ? JWT_AUTH_SECRET_KEY : false; + /** Valid credentials, the user exists create the according Token */ + $issuedAt = time(); + $notBefore = apply_filters( 'jwt_auth_not_before', $issuedAt, $issuedAt ); + $expire = apply_filters( 'jwt_auth_expire', $issuedAt + ( DAY_IN_SECONDS * 7 ), $issuedAt ); + + $token = [ + 'iss' => get_bloginfo( 'url' ), + 'iat' => $issuedAt, + 'nbf' => $notBefore, + 'exp' => $expire, + 'data' => [ + 'user' => [ + 'id' => $user->data->ID, + ], + ], + ]; + + /** Let the user modify the token data before the sign. */ + $algorithm = self::get_algorithm(); + + if ( $algorithm === false ) { + return new WP_Error( + 'jwt_auth_unsupported_algorithm', + __( 'Algorithm not supported, see https://www.rfc-editor.org/rfc/rfc7518#section-3', 'wp-api-jwt-auth' ), + [ + 'status' => 403, + ] + ); + } + + $token = JWT::encode( + apply_filters( 'jwt_auth_token_before_sign', $token, $user ), + $secret_key, + $algorithm + ); + + /** The token is signed, now create the object with no sensible user data to the client*/ + return [ + 'token' => $token, + 'user_email' => $user->data->user_email, + 'user_nicename' => $user->data->user_nicename, + 'user_display_name' => $user->data->display_name, + ]; + } + /** * This is our Middleware to try to authenticate the user according to the * token send. @@ -406,6 +421,58 @@ public static function validate_token( WP_REST_Request $request, $custom_token = } } + public function refresh_access_token(WP_REST_Request $request) { + $validated = $this->validate_token( $request ); + if ( !$validated || is_wp_error( $validated ) ) { + return $validated; + } + $user = wp_get_current_user(); + if ( empty( $user->ID ) ) { + return new WP_Error( + 'jwt_auth_no_user', + 'No user logged in', + [ + 'status' => 403, + ] + ); + } + $auth = self::generate_token_for_user( $user ); + if ( is_wp_error( $auth ) ) { + return $auth; + } + $token = $auth['token']; + + //remove_filter( 'authenticate', [ $this, 'allow_programmatic_login' ], 10 ); + + if ( $token ) { + return [ +// 'login_method' => DT_Login_Methods::MOBILE, + 'token' => $token, + ]; + } + } + + public function exchange_cookie_for_jwt(WP_REST_Request $request) { + $cookie_user = wp_validate_auth_cookie(); + + $user = get_user_by( 'ID', $cookie_user ); + if ( empty( $user->ID ) ) { + return new WP_Error( + 'jwt_auth_no_user', + 'No user logged in', + [ + 'status' => 403, + ] + ); + } + $auth = self::generate_token_for_user( $user ); + $token = $auth['token']; + wp_redirect( 'exp://127.0.0.1:8081/?token=' . $token ); + //wp_redirect( 'discipletools://example.com/?token=' . $token ); + //wp_redirect( 'dt://example.com/?token=' . $token ); + exit; + } + /** * Filter to hook the rest_pre_dispatch, if the is an error in the request * send it, if there is no error just continue with the current request.