Usted estĆ” aquĆ:
Crear una devolución de llamada del lado del servidor de Inicio de sesión integrado
Utilice la devolución de llamada del lado del servidor en vez de una devolución de llamada del lado del cliente para evitar exponer el token de acceso en el cliente. Para crear una devolución de llamada del lado del servidor, utilice el flujo servidor web de OAuth 2.0.
Inicio de sesión integrado se basa en cookies de terceros, que estĆ”n bloqueadas o restringidas en la mayorĆa de navegadores. Inicio de sesión integrado solo funciona en Google Chrome y solo si las cookies de terceros estĆ”n permitidas allĆ de forma predeterminada.
Cuando utiliza la devolución de llamada del lado del servidor, cree un servlet separado que implemente el flujo de servidor web utilizando el tipo de otorgamiento de código de autorización OAuth 2.0.
Utilice estos pasos para crear el servlet de devolución de llamadas del lado del servidor.
- Implemente el flujo de servidor web. Para ver los pasos detallados para implementar este flujo, consulte Flujo de servidor web de OAuth 2.0 para la integración de aplicaciones web.
-
Cree la respuesta de OAuth que publica Inicio de sesión integrado después de recibir un token de acceso con éxito.
La respuesta debe contener estas etiquetas meta.
- salesforce-community
- salesforce-mode (donde el valor termina por -callback)Nota El valor de la etiqueta meta salesforce-mode es el mismo modo especificado en la pÔgina web de Inicio de sesión integrado con el sufijo -callback. Por ejemplo, si salesforce-mode en la pÔgina web estÔ establecido en modal, el valor es modal-callback.
- salesforce-server-callback (donde el valor debe ser
true) - salesforce-server-response
- salesforce-server-starturlNota Si el parÔmetro Bloquear redireccionamiento a URL desconocida estÔ activado para el sitio, Salesforce bloquea los redireccionamientos a direcciones URL desconocidas proporcionados en el parÔmetro de estado de la respuesta de OAuth. Los redireccionamientos se permiten cuando la URL estÔ en el mismo host o dominio que el sitio, o estÔ en la lista de admisión en la metaetiqueta salesforce-allowed-domains de Inicio de sesión integrado.
- salesforce-target
- salesforce-allowed-domains
Puede incluir salesforce-save-access-token con el valortruepara guardar el token de acceso después de la inicialización. Antes de guardar el token de acceso, puede seguir interactuando con Salesforce durante la sesión de usuario activa. -
En su pÔgina web de Inicio de sesión integrado, especifique estas etiquetas meta.
-
Agregue la etiqueta meta salesforce-server-callback con el valor
true. Esta etiqueta meta indica que la devolución de llamada debe controlar la respuesta HTTP en el servidor.<meta name="salesforce-server-callback" content="true"> -
Asegúrese de que la etiqueta meta salesforce-redirect-uri hace referencia a la ubicación del servlet de devolución de llamadas del lado del servidor. Utilice la misma URL especificada en el campo URL de devolución de llamada de su aplicación cliente externa Inicio de sesión integrado.
<meta name="salesforce-redirect-uri" content="https://embeddedlogin.heroku.com/servlet/servlet.serversidecallback> - Asegúrese de que salesforce-mode en esta pÔgina web coincide con el modo en la devolución de llamada del lado del servidor.
-
Agregue la etiqueta meta salesforce-server-callback con el valor
package servlet;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.json.JSONObject;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
@WebServlet(
name = "CallbackServlet2",
urlPatterns = {"/_callback"}
)
public class ServerSideCallbacks extends HttpServlet{
// Client ID
private static final String CLIENT_ID=
"3MVG9xOCXq4ID1uF8V6oKd32SPVi6FHwEOQlQ5BjvaKX.5QZpGe4Z3F4fc6KvMYsQ.fi314cp0oZ8KpOBs4Mh";
// client secret
private static final String CLIENT_SECRET = "9103416584217247123";
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
String code = request.getParameter("code");
if (code != null) {
code = URLDecoder.decode(code, "UTF-8");
}
String startURL = request.getParameter("state");
if (startURL != null) {
startURL = URLDecoder.decode(startURL, "UTF-8");
}
String tokenResponse = null;
String communityUrl = null;
HttpClient httpclient = new HttpClient();
try {
// community_url parameter passed from redirect uri.
communityUrl = request.getParameter("sfdc_community_url");
// Token endpoint : communityUrl + "/services/oauth2/token";
PostMethod post = new PostMethod(communityUrl+"/services/oauth2/token");
post.addParameter("code",code);
post.addParameter("grant_type","authorization_code");
// Consumer key of the external client app.
post.addParameter("client_id", CLIENT_ID);
// Consumer Secret of the external client app.
post.addParameter("client_secret",CLIENT_SECRET);
// Callback URL of the external client app.
post.addParameter("redirect_uri",
"https://boiling-brushlands-41143.herokuapp.com/_callback");
httpclient.executeMethod(post);
tokenResponse = post.getResponseBodyAsString();
post.releaseConnection();
System.err.println("tokenResponse: " + tokenResponse);
} catch (Exception e) {
throw new ServletException(e);
}
JSONObject identityJSON = null;
try {
JSONObject token = new JSONObject(tokenResponse);
// get the access token from the response
String accessToken = token.getString("access_token");
String identity = token.getString("id");
httpclient = new HttpClient();
GetMethod get = new GetMethod(identity + "?version=latest");
get.setFollowRedirects(true);
get.addRequestHeader("Authorization", "Bearer " + accessToken);
// get identity information using the access token
httpclient.executeMethod(get);
String identityResponse = get.getResponseBodyAsString();
get.releaseConnection();
identityJSON = new JSONObject(identityResponse);
identityJSON.put("access_token", accessToken);
} catch (Exception e) {
throw new ServletException(e);
}
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
// Notice that weāre using base64 encoded
String outputStr = "<html><head>\n" +
"<meta name=\"salesforce-community\" content=\""+ communityUrl +"\">\n" +
// notice the -callback in the salesforce-mode content value
"<meta name=\"salesforce-mode\" content=\"modal-callback\">\n" +
"<meta name=\"salesforce-server-callback\" content=\"true\">\n" +
// send the identity information back to the Embedded Login
"<meta name=\"salesforce-server-response\" content='" +
Base64.getEncoder().encodeToString(identityJSON.toString().
getBytes(StandardCharsets.UTF_8))+"'>\n" +
"<meta name=\"salesforce-server-starturl\" content='" + startURL +"'>\n" +
"<meta name=\"salesforce-target\" content= \"#salesforce-login\">\n"+
"<meta name=\"salesforce-allowed-domains\"
content=\"boiling-brushlands-41143.herokuapp.com\">\n" +
"<script src=\""+ communityUrl +
"/servlet/servlet.loginwidgetcontroller?type=javascript_widget\"" +
" async defer></script>\n" +
"</head><body></body></html>";
out.write(outputStr);
}
}

