Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package me.djtheredstoner.devauth.common.auth.microsoft.oauth;

public class AuthorizationCodeAndPort {
private final String code;
private final int port;

public AuthorizationCodeAndPort(String code, int port) {
this.code = code;
this.port = port;
}

public String getCode() {
return code;
}

public int getPort() {
return port;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

public class CodeOAuthProvider extends OAuthProvider {

private static final String REDIRECT_URI = "http://127.0.0.1:3000";
private static final String REDIRECT_URI = "http://127.0.0.1:%d";
private static final String OAUTH_URL = "https://login.live.com/oauth20_authorize.srf";
private static final String OAUTH_TOKEN_URL = "https://login.live.com/oauth20_token.srf";

Expand All @@ -37,10 +37,10 @@ public OAuthToken getOAuthToken() {
new SecureRandom().nextBytes(bytes);
String codeVerifier = Base64.getUrlEncoder().withoutPadding().encodeToString(bytes);

String oAuthCode = getAuthorizationCode(codeVerifier);
AuthorizationCodeAndPort oAuthCode = getAuthorizationCode(codeVerifier);

return getAuthorizationToken(Util.stringMap(
"code", oAuthCode,
return getAuthorizationToken(oAuthCode.getPort(), Util.stringMap(
"code", oAuthCode.getCode(),
"grant_type", "authorization_code",
"code_verifier", codeVerifier
));
Expand All @@ -49,7 +49,9 @@ public OAuthToken getOAuthToken() {
@Override
public OAuthToken refreshToken(OAuthToken token) {
try {
return getAuthorizationToken(Util.stringMap(
// Previously the port was hardcoded to 3000, so default to that if it's not set
int port = token.getPort() != null ? token.getPort() : 3000;
return getAuthorizationToken(port, Util.stringMap(
"grant_type", "refresh_token",
"refresh_token", token.getRefreshToken()
));
Expand All @@ -59,11 +61,11 @@ public OAuthToken refreshToken(OAuthToken token) {
}
}

private OAuthToken getAuthorizationToken(Map<String, String> extraParams) {
private OAuthToken getAuthorizationToken(int port, Map<String, String> extraParams) {
Map<String, String> params = Util.stringMap(
"client_id", Constants.CLIENT_ID,
"scope", scopes,
"redirect_uri", REDIRECT_URI
"redirect_uri", String.format(REDIRECT_URI, port)
);
params.putAll(extraParams);

Expand All @@ -73,14 +75,16 @@ private OAuthToken getAuthorizationToken(Map<String, String> extraParams) {
.execute()
.into(Http::jsonResponse);

return OAuthToken.fromJson(res);
return OAuthToken.fromJson(res, port);
}

public String getAuthorizationCode(String codeVerifier) {
public AuthorizationCodeAndPort getAuthorizationCode(String codeVerifier) {
HttpServer server = null;
try {
server = HttpServer.create(new InetSocketAddress("0.0.0.0", 3000), 0);
CompletableFuture<String> future = new CompletableFuture<>();
server = HttpServer.create(new InetSocketAddress("0.0.0.0", 0), 0);
CompletableFuture<AuthorizationCodeAndPort> future = new CompletableFuture<>();
int port = server.getAddress().getPort();

server.createContext("/", (req) -> {
URI uri = req.getRequestURI();

Expand Down Expand Up @@ -109,14 +113,14 @@ public String getAuthorizationCode(String codeVerifier) {
);
}

future.complete(query.get("code"));
future.complete(new AuthorizationCodeAndPort(query.get("code"), port));
});
server.start();

String queryString = MSAUtil.buildQuery(Util.stringMap(
"client_id", Constants.CLIENT_ID,
"response_type", "code",
"redirect_uri", REDIRECT_URI,
"redirect_uri", String.format(REDIRECT_URI, server.getAddress().getPort()),
"scope", scopes,
"prompt", "select_account",
"code_challenge", Base64.getUrlEncoder().withoutPadding().encodeToString(DigestUtils.sha256(codeVerifier)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,28 @@

public class OAuthToken extends Token{
private final String refreshToken;
private final Integer port;

public OAuthToken(String token, String refreshToken, long expiry) {
public OAuthToken(String token, String refreshToken, long expiry, int port) {
super(token, expiry);
this.refreshToken = refreshToken;
this.port = port;
}

public String getRefreshToken() {
return refreshToken;
}

public static OAuthToken fromJson(JsonObject object) {
public Integer getPort() {
return port;
}

public static OAuthToken fromJson(JsonObject object, int port) {
return new OAuthToken(
object.get("access_token").getAsString(),
object.get("refresh_token").getAsString(),
object.get("expires_in").getAsInt() + Util.secondsSinceEpoch()
object.get("expires_in").getAsInt() + Util.secondsSinceEpoch(),
port
);
}

Expand Down