@@ -35,10 +35,11 @@ function reset() {
35
35
function getService_ ( ) {
36
36
return OAuth2 . createService ( 'Basecamp' )
37
37
// Set the endpoint URLs.
38
- . setAuthorizationBaseUrl (
39
- 'https://launchpad.37signals.com/authorization/new?type=web_server' )
40
- . setTokenUrl (
41
- 'https://launchpad.37signals.com/authorization/token?type=web_server' )
38
+ . setAuthorizationBaseUrl ( 'https://launchpad.37signals.com/authorization/new' )
39
+ . setTokenUrl ( 'https://launchpad.37signals.com/authorization/token' )
40
+
41
+ // Set the required type param
42
+ . setParam ( 'type' , 'web_server' )
42
43
43
44
// Set the client ID and secret.
44
45
. setClientId ( CLIENT_ID )
@@ -49,7 +50,11 @@ function getService_() {
49
50
. setCallbackFunction ( 'authCallback' )
50
51
51
52
// Set the property store where authorized tokens should be persisted.
52
- . setPropertyStore ( PropertiesService . getUserProperties ( ) ) ;
53
+ . setPropertyStore ( PropertiesService . getUserProperties ( ) )
54
+
55
+ // Set the handler for adding Basecamp's required type parameter to the
56
+ // payload:
57
+ . setTokenPayloadHandler ( basecampTokenHandler ) ;
53
58
}
54
59
55
60
/**
@@ -65,6 +70,23 @@ function authCallback(request) {
65
70
}
66
71
}
67
72
73
+ /**
74
+ * Adds the Basecamp API's required type parameter to the access token
75
+ * request payload.
76
+ */
77
+ function basecampTokenHandler ( payload ) {
78
+ // If it's refresh request from library
79
+ if ( payload . grant_type === 'refresh_token' ) {
80
+ // Basecamp refresh token API returns error if type is not specified
81
+ payload . type = 'refresh' ;
82
+ } else {
83
+ // Basecamp token API returns error if type is not specified
84
+ payload . type = 'web_server' ;
85
+ }
86
+
87
+ return payload ;
88
+ }
89
+
68
90
/**
69
91
* Logs the redict URI to register.
70
92
*/
0 commit comments