11package com .github .scribejava .core .oauth ;
22
3+ import com .github .scribejava .core .services .Base64Encoder ;
34import com .ning .http .client .ProxyServer ;
45import java .io .IOException ;
6+ import java .nio .charset .Charset ;
57import java .util .concurrent .Future ;
68import com .github .scribejava .core .builder .api .DefaultApi20 ;
79import com .github .scribejava .core .model .AbstractRequest ;
@@ -30,10 +32,29 @@ public OAuth20Service(DefaultApi20 api, OAuthConfig config) {
3032 this .api = api ;
3133 }
3234
35+ //sync version, protected to facilitate mocking
36+ protected OAuth2AccessToken sendTokenSync (OAuthRequest request ) {
37+ return api .getAccessTokenExtractor ().extract (request .send ().getBody ());
38+ }
39+
40+ //async version, protected to facilitate mocking
41+ protected Future <OAuth2AccessToken > sendTokenAsync (OAuthRequestAsync request ,
42+ OAuthAsyncRequestCallback <OAuth2AccessToken > callback , ProxyServer proxyServer ) {
43+
44+ return request .sendAsync (callback , new OAuthRequestAsync .ResponseConverter <OAuth2AccessToken >() {
45+ @ Override
46+ public OAuth2AccessToken convert (com .ning .http .client .Response response ) throws IOException {
47+ return getApi ().getAccessTokenExtractor ()
48+ .extract (OAuthRequestAsync .RESPONSE_CONVERTER .convert (response ).getBody ());
49+ }
50+ }, proxyServer );
51+ }
52+
3353 public final OAuth2AccessToken getAccessToken (String code ) {
34- final Response response = createAccessTokenRequest (code ,
35- new OAuthRequest (api .getAccessTokenVerb (), api .getAccessTokenEndpoint (), this )).send ();
36- return api .getAccessTokenExtractor ().extract (response .getBody ());
54+ final OAuthRequest request = createAccessTokenRequest (code ,
55+ new OAuthRequest (api .getAccessTokenVerb (), api .getAccessTokenEndpoint (), this ));
56+
57+ return sendTokenSync (request );
3758 }
3859
3960 /**
@@ -53,13 +74,8 @@ public final Future<OAuth2AccessToken> getAccessTokenAsync(String code,
5374 OAuthAsyncRequestCallback <OAuth2AccessToken > callback , ProxyServer proxyServer ) {
5475 final OAuthRequestAsync request = createAccessTokenRequest (code ,
5576 new OAuthRequestAsync (api .getAccessTokenVerb (), api .getAccessTokenEndpoint (), this ));
56- return request .sendAsync (callback , new OAuthRequestAsync .ResponseConverter <OAuth2AccessToken >() {
57- @ Override
58- public OAuth2AccessToken convert (com .ning .http .client .Response response ) throws IOException {
59- return getApi ().getAccessTokenExtractor ()
60- .extract (OAuthRequestAsync .RESPONSE_CONVERTER .convert (response ).getBody ());
61- }
62- }, proxyServer );
77+
78+ return sendTokenAsync (request , callback , proxyServer );
6379 }
6480
6581 protected <T extends AbstractRequest > T createAccessTokenRequest (String code , T request ) {
@@ -78,9 +94,10 @@ protected <T extends AbstractRequest> T createAccessTokenRequest(String code, T
7894 }
7995
8096 public final OAuth2AccessToken refreshAccessToken (String refreshToken ) {
81- final Response response = createRefreshTokenRequest (refreshToken ,
82- new OAuthRequest (api .getAccessTokenVerb (), api .getRefreshTokenEndpoint (), this )).send ();
83- return api .getAccessTokenExtractor ().extract (response .getBody ());
97+ final OAuthRequest request = createRefreshTokenRequest (refreshToken ,
98+ new OAuthRequest (api .getAccessTokenVerb (), api .getAccessTokenEndpoint (), this ));
99+
100+ return sendTokenSync (request );
84101 }
85102
86103 public final Future <OAuth2AccessToken > refreshAccessTokenAsync (String refreshToken ,
@@ -92,13 +109,8 @@ public final Future<OAuth2AccessToken> refreshAccessTokenAsync(String refreshTok
92109 OAuthAsyncRequestCallback <OAuth2AccessToken > callback , ProxyServer proxyServer ) {
93110 final OAuthRequestAsync request = createRefreshTokenRequest (refreshToken ,
94111 new OAuthRequestAsync (api .getAccessTokenVerb (), api .getRefreshTokenEndpoint (), this ));
95- return request .sendAsync (callback , new OAuthRequestAsync .ResponseConverter <OAuth2AccessToken >() {
96- @ Override
97- public OAuth2AccessToken convert (com .ning .http .client .Response response ) throws IOException {
98- return getApi ().getAccessTokenExtractor ()
99- .extract (OAuthRequestAsync .RESPONSE_CONVERTER .convert (response ).getBody ());
100- }
101- }, proxyServer );
112+
113+ return sendTokenAsync (request , callback , proxyServer );
102114 }
103115
104116 protected <T extends AbstractRequest > T createRefreshTokenRequest (String refreshToken , T request ) {
@@ -113,6 +125,67 @@ protected <T extends AbstractRequest> T createRefreshTokenRequest(String refresh
113125 return request ;
114126 }
115127
128+ /**
129+ * Request Access Token Password Grant sync version
130+ *
131+ * @param uname User name
132+ * @param password User password
133+ * @return OAuth2AccessToken
134+ */
135+
136+ public final OAuth2AccessToken getAccessTokenPasswordGrant (String uname , String password ) {
137+ final OAuthRequest request = createAccessTokenPasswordGrantRequest (uname , password ,
138+ new OAuthRequest (api .getAccessTokenVerb (), api .getAccessTokenEndpoint (), this ));
139+
140+ return sendTokenSync (request );
141+ }
142+
143+ /**
144+ * Request Access Token Password Grant async version
145+ *
146+ * @param uname User name
147+ * @param password User password
148+ * @param callback Optional callback
149+ * @return Future
150+ */
151+ public final Future <OAuth2AccessToken > getAccessTokenPasswordGrantAsync (String uname , String password ,
152+ OAuthAsyncRequestCallback <OAuth2AccessToken > callback ) {
153+ final OAuthRequestAsync request = createAccessTokenPasswordGrantRequest (uname , password ,
154+ new OAuthRequestAsync (api .getAccessTokenVerb (), api .getAccessTokenEndpoint (), this ));
155+
156+ return getAccessTokenPasswordGrantAsync (uname , password , callback , null );
157+ }
158+
159+ public final Future <OAuth2AccessToken > getAccessTokenPasswordGrantAsync (String uname , String password ,
160+ OAuthAsyncRequestCallback <OAuth2AccessToken > callback , ProxyServer proxyServer ) {
161+ final OAuthRequestAsync request = createAccessTokenPasswordGrantRequest (uname , password ,
162+ new OAuthRequestAsync (api .getAccessTokenVerb (), api .getAccessTokenEndpoint (), this ));
163+
164+ return sendTokenAsync (request , callback , proxyServer );
165+ }
166+
167+ protected <T extends AbstractRequest > T createAccessTokenPasswordGrantRequest (String username , String password , T request ) {
168+ final OAuthConfig config = getConfig ();
169+ request .addParameter (OAuthConstants .USERNAME , username );
170+ request .addParameter (OAuthConstants .PASSWORD , password );
171+
172+ if (config .hasScope ()) {
173+ request .addParameter (OAuthConstants .SCOPE , config .getScope ());
174+ }
175+
176+ request .addParameter (OAuthConstants .GRANT_TYPE , OAuthConstants .PASSWORD );
177+
178+ request .addHeader (OAuthConstants .HEADER , OAuthConstants .BASIC + " " +
179+ Base64Encoder .getInstance ().encode (
180+ String .format ("%s:%s" , config .getApiKey (), config .getApiSecret ()).getBytes (
181+ Charset .forName ("UTF-8" )
182+ )
183+ )
184+ );
185+
186+ return request ;
187+ }
188+
116189 /**
117190 * {@inheritDoc}
118191 */
0 commit comments