001package com.nimbusds.oauth2.sdk;
002
003
004import java.util.LinkedHashMap;
005import java.util.Map;
006
007import net.jcip.annotations.Immutable;
008
009import com.nimbusds.oauth2.sdk.token.RefreshToken;
010
011
012/**
013 * Refresh token grant. Used in refresh token requests.
014 *
015 * <p>Note that the optional scope parameter is not supported.
016 *
017 * <p>Related specifications:
018 *
019 * <ul>
020 *     <li>OAuth 2.0 (RFC 6749), section 6.
021 * </ul>
022 */
023@Immutable
024public class RefreshTokenGrant extends AuthorizationGrant {
025
026
027        /**
028         * The grant type.
029         */
030        public static final GrantType GRANT_TYPE = GrantType.REFRESH_TOKEN;
031
032
033        /**
034         * The refresh token.
035         */
036        private final RefreshToken refreshToken;
037
038
039        /**
040         * Creates a new refresh token grant.
041         *
042         * @param refreshToken The refresh token. Must not be {@code null}.
043         */
044        public RefreshTokenGrant(final RefreshToken refreshToken) {
045
046
047                super(GRANT_TYPE);
048
049                if (refreshToken == null)
050                        throw new IllegalArgumentException("The refresh token must not be null");
051
052                this.refreshToken = refreshToken;
053        }
054
055
056        /**
057         * Gets the refresh token.
058         *
059         * @return The refresh token.
060         */
061        public RefreshToken getRefreshToken() {
062
063                return refreshToken;
064        }
065
066
067        @Override
068        public Map<String,String> toParameters() {
069
070                Map<String,String> params = new LinkedHashMap<>();
071                params.put("grant_type", GRANT_TYPE.getValue());
072                params.put("refresh_token", refreshToken.getValue());
073                return params;
074        }
075
076
077        @Override
078        public boolean equals(Object o) {
079                if (this == o) return true;
080                if (o == null || getClass() != o.getClass()) return false;
081
082                RefreshTokenGrant grant = (RefreshTokenGrant) o;
083
084                return refreshToken.equals(grant.refreshToken);
085
086        }
087
088
089        @Override
090        public int hashCode() {
091                return refreshToken.hashCode();
092        }
093
094
095        /**
096         * Parses a refresh token grant from the specified parameters.
097         *
098         * <p>Example:
099         *
100         * <pre>
101         * grant_type=refresh_token
102         * refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
103         * </pre>
104         *
105         * @param params The parameters.
106         *
107         * @return The refresh token grant.
108         *
109         * @throws ParseException If parsing failed.
110         */
111        public static RefreshTokenGrant parse(final Map<String,String> params)
112                throws ParseException {
113
114                // Parse grant type
115                String grantTypeString = params.get("grant_type");
116
117                if (grantTypeString == null)
118                        throw new ParseException("Missing \"grant_type\" parameter", OAuth2Error.INVALID_REQUEST);
119
120                if (! GrantType.parse(grantTypeString).equals(GRANT_TYPE))
121                        throw new ParseException("The \"grant_type\" must be " + GRANT_TYPE, OAuth2Error.UNSUPPORTED_GRANT_TYPE);
122
123                // Parse refresh token
124                String refreshTokenString = params.get("refresh_token");
125
126                if (refreshTokenString == null || refreshTokenString.trim().isEmpty())
127                        throw new ParseException("Missing or empty \"refresh_token\" parameter", OAuth2Error.INVALID_REQUEST);
128
129                RefreshToken refreshToken = new RefreshToken(refreshTokenString);
130
131                return new RefreshTokenGrant(refreshToken);
132        }
133}