Как отобразить переменную из SPAppToken в AuthorizationCodeTokenRequest
Я зарегистрировал свое приложение App Engine в своей среде Office 365, и URL-адрес обратного вызова работает, я получаю SPAppToken.
Я хочу получить токен доступа, используя этот класс Java:
У меня вопрос, какие из приведенных ниже значений соответствуют значениям, найденным в SPAppToken? Учетными данными в ClientAuthentication являются applicationId и applicationSecret I. RedirectURI должен вернуться к моему приложению. Я думаю, что GenericURL должен быть заполнен с помощью https://accounts.accesscontrol.windows.net/tokens/OAuth/2
Но я продолжаю получать: Ошибка: invalid_request ACS90019: Невозможно определить идентификатор клиента из запроса.
Ниже код xx означает переменную, которую мне нужно заменить, а далее под SPAppToken (декодируется из base64)
try {TokenResponse response = new AuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(), new GenericUrl(**"https://server.example.com/token"**), **"SplxlOBeZQQYbYS6WxSbIA"**).setRedirectUri("https://client.example.com/rd") .setClientAuthentication(new BasicAuthentication(**"s6BhdRkqt3"**, **"7Fjfp0ZBr1KtDRbnfVdmIw"**)).execute();
System.out.println("Access token: " + response.getAccessToken());
} catch (TokenResponseException e) {
if (e.getDetails() != null) {
System.err.println("Error: " + e.getDetails().getError());
if (e.getDetails().getErrorDescription() != null) {
System.err.println(e.getDetails().getErrorDescription());
}
if (e.getDetails().getErrorUri() != null) {
System.err.println(e.getDetails().getErrorUri());
}
} else {
System.err.println(e.getMessage());
}
}
SPAppToken расшифровывается:
{"typ":"JWT","alg":"HS256"}{"aud":"e9e91cd9-0d95-46b7-8a05-f614a683e35d/eog-fire-ice.appspot.com@19d9feae-ba24-4c9e-831c-3132f2ea3974","iss":"00000001-0000-0000-c000-000000000000@19d9feae-ba24-4c9e-831c-3132f2ea3974","nbf":1353777617,"exp":1353820817,"appctxsender":"00000003-0000-0ff1-ce00-000000000000@19d9feae-ba24-4c9e-831c-3132f2ea3974","appctx":"{\"CacheKey\":\"hwqDPFbKDL9mIYpbReWYHeez1uES77UqEsxwienRA9g=\",\"SecurityTokenServiceUri\":\"https://accounts.accesscontrol.windows.net/tokens/OAuth/2\"}","refreshtoken":"IAAAAAi52NL58kY1UUpnmUJ9TPO7BpDSd6NqQGHbdfAEnOgioNbG8AwTGgf-3HPSNrdDexk5UUA3QFox_sky4_uon0XmLl6EfpqsC6RTpiatjJxXzB7EFJrqsiYI98MULyCubxjR5UyQwFzLvEjljEom7XcEXB2YCCWJQQdSRvFU4xo4NIPoUObhyjTK58TaCipUU3D4EiLJRSlkbcm_Y3VrVd8GMoQ8kx6BmJjeaGKZsJXWb7UJ8YTg6L4-HOoAiU3MymJl3oBxv_9rvHDmKb4FJ7vrN8AhJYUqlr9rZxOtG_BVeUX05E-umfoUU4PL2Cj-p7u4YOPo6rqVahovwGwYPn-pZbPfIcTj3TzKZdIk7OLemdR_S8_v0gASEM1Y_KTHsoQ6k-uZaa3QGZN4icu-Jp6Jh4UTRZuomLtkLmg7VVZL6VKpXUVW7RjUopoSEffb5RVmMVNOkNV4_r5NT7pjL0pWAk-uipTF0qLAMzEfr5M9YKNgBlbRbvjlePFz6co5_uOyY8VbfJsIqGhTr1dvW6o","isbrowserhostedapp":"true"}R?????XE??j?2??pZ?????0jLk
----- новая информация 2012-26-11 ------ После изменения поля "code", содержащего токен обновления, и использования всего значения aud вместо только applicationID, я получаю это сообщение:
ACS50001: The required field 'resource' is missing.
Вопрос в том, приближаюсь я или нет?
Я также задал этот вопрос здесь: https://groups.google.com/d/topic/google-oauth-java-client/EZtlwDbY_wk/discussion
1 ответ
Я изменил com.google.api.client.json.JSONParser.java и поместил этот код в свой сервлет:
JsonWebSignature jws = JsonWebSignature.parse(new JacksonFactory(), req.getParameter("SPAppToken"));
JsonParser jsonParser = new JacksonFactory().createJsonParser(jws.getPayload().get("appctx").toString());
//Create my own AppTxc that extends GenericJSON
AppCtx appCtx = jsonParser.parse(AppCtx.class, new CustomizeJsonParser());
String appctxsender=jws.getPayload().get("appctxsender").toString();
String[] splitApptxSender = appctxsender.split("@");
//sharepointhost name is part of the resource field
String sharepointServerHostName = new URL(req.getParameter("SPHostUrl")).getHost();
// create the resource field
String resource = splitApptxSender[0]+"/"+sharepointServerHostName+"@"+splitApptxSender[1];
try {
AuthorizationCodeTokenRequest tokenRequest = new AuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(),
new GenericUrl(appCtx.getSecurityTokenServiceUri()), jws.getPayload().get("refreshtoken").toString());
tokenRequest.setRedirectUri("https://eog-fire-ice.appspot.com/callback4fireandice");
tokenRequest.setClientAuthentication(
new ClientParametersAuthentication(jws.getPayload().getAudience(), SharePointAppSecret));
tokenRequest.setGrantType("refresh_token");
tokenRequest.set("resource", resource);
tokenRequest.set("refresh_token", jws.getPayload().get("refreshtoken").toString());
TokenResponse response =tokenRequest.execute();
String accesstoken=response.getAccessToken();
} catch (TokenResponseException e) {
if (e.getDetails() != null) {
pw.println("Error: " + e.getDetails().getError());
if (e.getDetails().getErrorDescription() != null) {
pw.println(e.getDetails().getErrorDescription());
}
if (e.getDetails().getErrorUri() != null) {
pw.println(e.getDetails().getErrorUri());
}
} else {
pw.println(e.getMessage());
}
}
Я не уверен, нужна ли вся информация (например, redirectURL, но теперь я получил токен доступа от Azure ACS.
Спасибо Нику Свону (lightningtools.com) за первоначальную помощь, основанную на Ruby on Rails.
Конечно же, спасибо Yaniv Inbar (https://plus.google.com/+YanivInbar/) за предоставление клиентской библиотеки google oauth java.
Мне пришлось поднять отчет об ошибке: http://code.google.com/p/google-oauth-java-client/issues/detail?id=62&q=Type%3DDefect&sort=priority&colspec=ID%20Milestone%20Summary