1111 * See the License for the specific language governing permissions and
1212 * limitations under the License.
1313 **/
14+
15+ use Illuminate \Http \Request ;
1416use Illuminate \Support \Facades \Route ;
1517use Illuminate \Support \Facades \Log ;
18+ use OAuth2 \Exceptions \OAuth2ResourceServerException ;
19+ use OAuth2 \OAuth2Protocol ;
20+ use URL \Normalizer ;
21+
1622/**
1723 * Class RequestUtils
1824 * @package libs\utils
1925 */
2026final class RequestUtils {
2127
2228 /**
23- * @param \Illuminate\Http\ Request $request
29+ * @param Request $request
2430 * @return bool|string
2531 */
2632 public static function getCurrentRoutePath ($ request )
@@ -42,4 +48,37 @@ public static function getCurrentRoutePath($request)
4248 return false ;
4349 }
4450
51+ /**
52+ * @param Request $request
53+ * @return string|null
54+ * @throws OAuth2ResourceServerException
55+ */
56+ public static function getOrigin (Request $ request ): ?string
57+ {
58+ // http://tools.ietf.org/id/draft-abarth-origin-03.html
59+ $ origin = $ request ->headers ->get ('Origin ' );
60+ $ referer = $ request ->headers ->get ('Referer ' );
61+
62+ if (!empty ($ origin ) && !empty ($ referer ) &&
63+ parse_url ($ origin , PHP_URL_HOST ) != parse_url ($ referer , PHP_URL_HOST ))
64+ {
65+ Log::warning ('OAuth2BearerAccessTokenRequestValidator::handle Origin and Referrer mismatch ' );
66+ throw new OAuth2ResourceServerException (
67+ 403 ,
68+ OAuth2Protocol::OAuth2Protocol_Error_InvalidRequest,
69+ 'Origin and Referrer mismatch '
70+ );
71+ }
72+ if (empty ($ origin ) && !empty ($ referer )) {
73+ $ referer_parts = parse_url ($ referer );
74+ $ origin = $ referer_parts ['scheme ' ] . ':// ' . $ referer_parts ['host ' ];
75+ if (!empty ($ origin )) {
76+ Log::warning ('OAuth2BearerAccessTokenRequestValidator::Origin header not present. Using normalized Referer as fallback: ' . $ origin );
77+ }
78+ }
79+ if (!empty ($ origin )) {
80+ $ origin = (new Normalizer ($ origin ))->normalize ();
81+ }
82+ return $ origin ;
83+ }
4584}
0 commit comments