Last month, I figured out how to use Spring’s RestTemplate to add issues to github programmatically figuring it would save me time in the future. Well, the future is here. I needed to add 16 issues (one per milestone.) I run my program and get a 401. In particular, I got
Apr 20, 2014 6:42:18 PM org.springframework.web.client.RestTemplate handleResponseError WARNING: GET request for "https://api.github.com/repos/boyarsky/repoName/issues" resulted in 401 (Unauthorized); invoking error handler Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 401 Unauthorized at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:588) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:546) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:502) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:444) at jb.Trial2.main(Trial2.java:29)
Right. I’ve changed my password AND enabled two factor authentication on github in the past month. Luckily, it was easy to switch my program to two factor. Here’s what I did.
Create personal use token
I created a second personal use token just like I did for for my git commmand line use by going to the applications page and clicking “generate new token”. I chose to create a separate token so I could revoke access as soon as I’m done running the web service.
Testing the token
Per the getting started with oauth doc, I ran a command line to test the token:
curl -i -H 'Authorization: token notMy40CharToken' \ https://api.github.com/user
Wrote another trial program
I adapted my second trial program from the initial iterations to test out two factor.
package jb; import org.springframework.http.*; import org.springframework.web.client.*; /** * Call a web service that uses authenticated user to test passing credentials * * @author jeanne * */ public class Trial3 { public static void main(String[] args) { String url = "https://api.github.com/repos/boyarsky/oca-ocp-book/issues"; HttpHeaders headers = new HttpHeaders(); String personalToken = "notMy40CharToken"; headers.add("Authorization", "token " + personalToken); // ignore result because just testing connectivity HttpEntity<String> request = new HttpEntity<String>(headers); RestTemplate template = new RestTemplate(); template.exchange(url, HttpMethod.GET, request, Object[].class); System.out.println("success"); } }
I then replaced the authentication part of my real program and it worked like a charm. Even with the changes to the program, it was faster than creating 16 issues by hand with the proper text/assignee/milestone.
Delete the personal token
I deleted the token to ensure it never gets used again. I don’t want to run the program by accident with my credentials. Or accidentally post the token here.