package org.pac4j.oauth.profile.ok; import com.fasterxml.jackson.databind.JsonNode; import com.github.scribejava.core.model.OAuth2AccessToken; import org.pac4j.core.exception.HttpAction; import org.pac4j.core.profile.converter.Converters; import org.pac4j.oauth.client.OkClient; import org.pac4j.oauth.config.OAuth20Configuration; import org.pac4j.oauth.profile.JsonHelper; import org.pac4j.oauth.profile.definition.OAuth20ProfileDefinition; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * Represents the profile definitions on Ok.ru (Odnoklassniki.ru) * * @author imayka (imayka[at]ymail[dot]com) * @since 1.8 */ public class OkProfileDefinition extends OAuth20ProfileDefinition<OkProfile> { public static final String UID = "uid"; public static final String BIRTHDAY = "birthday"; public static final String AGE = "age"; public static final String NAME = "name"; public static final String LOCATION_CITY = "location.city"; public static final String LOCATION_COUNTRY = "location.country"; public static final String LOCATION_COUNTRY_CODE = "location.countryCode"; public static final String LOCATION_COUNTRY_NAME = "location.countryName"; public static final String ONLINE = "online"; public static final String LAST_NAME = "last_name"; public static final String HAS_EMAIL = "has_email"; public static final String CURRENT_STATUS = "current_status"; public static final String CURRENT_STATUS_ID = "current_status_id"; public static final String CURRENT_STATUS_DATE = "current_status_date"; public static final String PIC_1 = "pic_1"; public static final String PIC_2 = "pic_2"; private static final String API_BASE_URL = "http://api.ok.ru/fb.do?"; public OkProfileDefinition() { super(x -> new OkProfile()); Arrays.stream(new String[] {UID, BIRTHDAY, AGE, NAME, LOCATION_CITY, LOCATION_COUNTRY, LOCATION_COUNTRY_CODE, LOCATION_COUNTRY_NAME, ONLINE, LAST_NAME, HAS_EMAIL, CURRENT_STATUS, CURRENT_STATUS_ID, CURRENT_STATUS_DATE}) .forEach(a -> primary(a, Converters.STRING)); primary(PIC_1, Converters.URL); primary(PIC_2, Converters.URL); } @Override public String getProfileUrl(final OAuth2AccessToken accessToken, final OAuth20Configuration configuration) { final OkClient client = (OkClient) configuration.getClient(); String baseParams = "application_key=" + client.getPublicKey() + "&format=json" + "&method=users.getCurrentUser"; String finalSign; try { String preSign = getMD5SignAsHexString(accessToken.getAccessToken() + configuration.getSecret()); finalSign = getMD5SignAsHexString(baseParams.replaceAll("&", "") + preSign); } catch (Exception e) { logger.error(e.getMessage()); return null; } return API_BASE_URL + baseParams + "&access_token=" + accessToken.getAccessToken() + "&sig=" + finalSign; } protected String getMD5SignAsHexString(final String strForEncoding) throws NoSuchAlgorithmException, UnsupportedEncodingException { MessageDigest md = MessageDigest.getInstance("MD5"); StringBuilder result = new StringBuilder(); for (byte aByte : md.digest(strForEncoding.getBytes("UTF-8"))) { if ((0xff & aByte) < 0x10) { result.append("0").append(Integer.toHexString(0xFF & aByte)); } else { result.append(Integer.toHexString(0xFF & aByte)); } } return result.toString(); } @Override public OkProfile extractUserProfile(String body) throws HttpAction { final OkProfile profile = newProfile(); JsonNode userNode = JsonHelper.getFirstNode(body); if (userNode != null) { profile.setId(JsonHelper.getElement(userNode, OkProfileDefinition.UID)); for (final String attribute : getPrimaryAttributes()) { convertAndAdd(profile, attribute, JsonHelper.getElement(userNode, attribute)); } } return profile; } }