OAuth Server enhancements -- more complete access token response and groundwork
for scope Summary: this patch makes the access token response "complete" relative to spec by returning when it expires AND that the token_type is in fact 'Bearer'. This patch also lays the groundwork for scope by fixing the underlying data model and adding the first scope checks for "offline_access" relative to expires and the "whoami" method. Further, conduit is augmented to open up individual methods for access via OAuth generally to enable "whoami" access. There's also a tidy little scope class to keep track of all the various scopes we plan to have as well as strings for display (T849 - work undone) Somewhat of a hack but Conduit methods by default have SCOPE_NOT_ACCESSIBLE. We then don't even bother with the OAuth stuff within conduit if we're not supposed to be accessing the method via Conduit. Felt relatively clean to me in terms of additional code complexity, etc. Next up ends up being T848 (scope in OAuth) and T849 (let user's authorize clients for specific scopes which kinds of needs T850). There's also a bunch of work that needs to be done to return the appropriate, well-formatted error codes. All in due time...! Test Plan: verified that an access_token with no scope doesn't let me see anything anymore. :( verified that access_tokens made awhile ago expire. :( Reviewers: epriestley Reviewed By: epriestley CC: aran, epriestley Maniphest Tasks: T888, T848 Differential Revision: https://secure.phabricator.com/D1657
This commit is contained in:
@@ -49,11 +49,15 @@ extends PhabricatorAuthController {
|
||||
);
|
||||
}
|
||||
|
||||
if ($server->userHasAuthorizedClient($client)) {
|
||||
$server->setClient($client);
|
||||
if ($server->userHasAuthorizedClient()) {
|
||||
$return_auth_code = true;
|
||||
$unguarded_write = AphrontWriteGuard::beginScopedUnguardedWrites();
|
||||
} else if ($request->isFormPost()) {
|
||||
$server->authorizeClient($client);
|
||||
// TODO -- T848 (add scope to Phabricator OAuth)
|
||||
// should have some $scope based off of user submission here...!
|
||||
$scope = array(PhabricatorOAuthServerScope::SCOPE_WHOAMI => 1);
|
||||
$server->authorizeClient($scope);
|
||||
$return_auth_code = true;
|
||||
$unguarded_write = null;
|
||||
} else {
|
||||
@@ -64,7 +68,7 @@ extends PhabricatorAuthController {
|
||||
if ($return_auth_code) {
|
||||
// step 1 -- generate authorization code
|
||||
$auth_code =
|
||||
$server->generateAuthorizationCode($client);
|
||||
$server->generateAuthorizationCode();
|
||||
|
||||
// step 2 -- error or return it
|
||||
if (!$auth_code) {
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
phutil_require_module('phabricator', 'aphront/writeguard');
|
||||
phutil_require_module('phabricator', 'applications/auth/controller/base');
|
||||
phutil_require_module('phabricator', 'applications/oauthserver/response');
|
||||
phutil_require_module('phabricator', 'applications/oauthserver/scope');
|
||||
phutil_require_module('phabricator', 'applications/oauthserver/server');
|
||||
phutil_require_module('phabricator', 'applications/oauthserver/storage/client');
|
||||
phutil_require_module('phabricator', 'view/form/base');
|
||||
|
||||
@@ -32,6 +32,7 @@ extends PhabricatorAuthController {
|
||||
$client_phid = $request->getStr('client_id');
|
||||
$client_secret = $request->getStr('client_secret');
|
||||
$response = new PhabricatorOAuthResponse();
|
||||
$server = new PhabricatorOAuthServer();
|
||||
if (!$code) {
|
||||
return $response->setMalformed(
|
||||
'Required parameter code missing.'
|
||||
@@ -48,6 +49,15 @@ extends PhabricatorAuthController {
|
||||
);
|
||||
}
|
||||
|
||||
$client = id(new PhabricatorOAuthServerClient())
|
||||
->loadOneWhere('phid = %s', $client_phid);
|
||||
if (!$client) {
|
||||
return $response->setNotFound(
|
||||
'Client with client_id '.$client_phid.' not found.'
|
||||
);
|
||||
}
|
||||
$server->setClient($client);
|
||||
|
||||
$auth_code = id(new PhabricatorOAuthServerAuthorizationCode())
|
||||
->loadOneWhere('code = %s', $code);
|
||||
if (!$auth_code) {
|
||||
@@ -55,9 +65,17 @@ extends PhabricatorAuthController {
|
||||
'Authorization code '.$code.' not found.'
|
||||
);
|
||||
}
|
||||
|
||||
$user_phid = $auth_code->getUserPHID();
|
||||
$user = id(new PhabricatorUser())
|
||||
->loadOneWhere('phid = %s', $auth_code->getUserPHID());
|
||||
$server = new PhabricatorOAuthServer($user);
|
||||
->loadOneWhere('phid = %s', $user_phid);
|
||||
if (!$user) {
|
||||
return $response->setNotFound(
|
||||
'User with phid '.$user_phid.' not found.'
|
||||
);
|
||||
}
|
||||
$server->setUser($user);
|
||||
|
||||
$test_code = new PhabricatorOAuthServerAuthorizationCode();
|
||||
$test_code->setClientSecret($client_secret);
|
||||
$test_code->setClientPHID($client_phid);
|
||||
@@ -69,19 +87,15 @@ extends PhabricatorAuthController {
|
||||
);
|
||||
}
|
||||
|
||||
$client = id(new PhabricatorOAuthServerClient())
|
||||
->loadOneWhere('phid = %s', $client_phid);
|
||||
if (!$client) {
|
||||
return $response->setNotFound(
|
||||
'Client with client_id '.$client_phid.' not found.'
|
||||
);
|
||||
}
|
||||
|
||||
$scope = AphrontWriteGuard::beginScopedUnguardedWrites();
|
||||
$access_token = $server->generateAccessToken($client);
|
||||
$access_token = $server->generateAccessToken();
|
||||
if ($access_token) {
|
||||
$auth_code->delete();
|
||||
$result = array('access_token' => $access_token->getToken());
|
||||
$result = array(
|
||||
'access_token' => $access_token->getToken(),
|
||||
'token_type' => 'Bearer',
|
||||
'expires_in' => PhabricatorOAuthServer::ACCESS_TOKEN_TIMEOUT,
|
||||
);
|
||||
return $response->setContent($result);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user