5
5
use Cake \Core \Configure ;
6
6
use Cake \Event \Event ;
7
7
use Cake \Event \EventManager ;
8
+ use Cake \I18n \Time ;
8
9
use League \OAuth2 \Server \Exception \AccessDeniedException ;
9
10
use League \OAuth2 \Server \Exception \OAuthException ;
10
11
use League \OAuth2 \Server \Util \RedirectUri ;
@@ -78,6 +79,9 @@ public function authorize()
78
79
return ;
79
80
}
80
81
82
+ $ ownerModel = $ this ->request ->query ('owner_model ' ) ?: 'Users ' ;
83
+ $ ownerId = $ this ->request ->query ('owner_id ' ) ?: $ this ->Auth ->user ('id ' );
84
+ $ clientId = $ this ->request ->query ('client_id ' );
81
85
if (!$ this ->Auth ->user ()) {
82
86
$ query = $ this ->request ->query ;
83
87
$ query ['redir ' ] = 'oauth ' ;
@@ -90,6 +94,18 @@ public function authorize()
90
94
'? ' => $ query
91
95
]
92
96
);
97
+ } else {
98
+ $ currentTokens = $ this ->loadModel ('OAuthServer.AccessTokens ' )
99
+ ->find ()
100
+ ->where (['expires > ' => Time::now ()->getTimestamp ()])
101
+ ->matching ('Sessions ' , function ($ q ) use ($ ownerModel , $ ownerId , $ clientId ) {
102
+ return $ q ->where ([
103
+ 'owner_model ' => $ ownerModel ,
104
+ 'owner_id ' => $ ownerId ,
105
+ 'client_id ' => $ clientId
106
+ ]);
107
+ })
108
+ ->count ();
93
109
}
94
110
95
111
$ event = new Event ('OAuthServer.beforeAuthorize ' , $ this );
@@ -101,9 +117,10 @@ public function authorize()
101
117
$ serializeKeys = array_keys ($ event ->result );
102
118
}
103
119
104
- if ($ this ->request ->is ('post ' ) && $ this ->request ->data ['authorization ' ] === 'Approve ' ) {
105
- $ ownerModel = isset ($ this ->request ->data ['owner_model ' ]) ? $ this ->request ->data ['owner_model ' ] : 'Users ' ;
106
- $ ownerId = isset ($ this ->request ->data ['owner_id ' ]) ? $ this ->request ->data ['owner_id ' ] : $ this ->Auth ->user ('id ' );
120
+
121
+ if ($ currentTokens > 0 || ($ this ->request ->is ('post ' ) && $ this ->request ->data ('authorization ' ) === 'Approve ' )) {
122
+ $ ownerModel = $ this ->request ->data ('owner_model ' ) ?: $ ownerModel ;
123
+ $ ownerId = $ this ->request ->data ('owner_id ' ) ?: $ ownerId ;
107
124
$ redirectUri = $ this ->OAuth ->Server ->getGrantType ('authorization_code ' )->newAuthorizeRequest ($ ownerModel , $ ownerId , $ authParams );
108
125
$ event = new Event ('OAuthServer.afterAuthorize ' , $ this );
109
126
EventManager::instance ()->dispatch ($ event );
0 commit comments