2013-02-04 37 views
1

我试图在Magento的REST服务中自动登录。一切都很好。除了我总是需要手动输入授权URL。我试图找到一个服务,或者我可以把授权URL,并从中获取验证码。没有手动做。用Java自动登录Magento OAuth

我用这个代码/教程:http://blog.jerrysapps.com/2012/11/05/using-the-magento-rest-api-in-java-with-scribe/

感谢。

编辑:现在您需要手动执行授权步骤,您需要点击按钮以“批准”并需要登录到Magento的后端。我想自动执行此操作。因此授权的步骤和洛到后端需要自动

+0

我不知道我完全理解你的问题 - 请详细说明。 –

+0

编辑了第一篇文章zaske – Gynnad

回答

0

也许不是最好的方法,但这为我工作。 据我了解,Magento令牌不会过期。他们可以手动撤销。 抄写员(在其他答案中提到)是我可以找到的最简单的方式获得授权。 我还使用一个非常方便的库Xstream与一个小型FileUtil类来存储和检索xml中的令牌和服务对象,以便我不必每次都授权并获取新令牌。也许不是使用的最佳实践和一些不必要的代码,但它只需要一次授权。首先,我使用createService(),然后使用Authorization类的start()方法。 下面是使用的Java类:

MagentoApi.java

package somepackage; 

import org.scribe.builder.api.DefaultApi10a; 
import org.scribe.model.Token; 

public class MagentoApi extends DefaultApi10a { 

private static final String AUTHORIZE_URL = "http://domain.com/admin/oauth_authorize"; 

@Override 
public String getAccessTokenEndpoint() { 
    return "http://domain.com/oauth/token"; 
} 

@Override 
public String getRequestTokenEndpoint() { 
    return "http://domain.com/oauth/initiate"; 
} 

@Override 
public String getAuthorizationUrl(Token requestToken) { 
    return AUTHORIZE_URL+"?oauth_token="+requestToken.getToken(); 
} 

} 

Authorization.java

package somepackage; 

import com.thoughtworks.xstream.XStream; 
import java.io.File; 
import java.util.Scanner; 
import org.scribe.builder.ServiceBuilder; 
import org.scribe.model.Token; 
import org.scribe.model.Verifier; 
import org.scribe.oauth.OAuthService; 


public class Authorization { 

private OAuthService service; 
private Token requestToken; 
private Token accessToken; 
private String authUrl; 

public Token start() { 

    File f = new File("token.xml"); 
    if (f.exists()) { 
     System.out.println("Feching Existing Token"); 
     loadToken(); 
     return accessToken; 
    } 

    Scanner in = new Scanner(System.in); 

    System.out.println("--- Magento OAuth Authorization ---\n"); 
    System.out.println("Fetching The Request Token..."); 
    requestToken = service.getRequestToken(); 
    System.out.println("Got The Request Token!\n"); 
    System.out.println(" Go & Authorize Magento Here:"); 
    authUrl = service.getAuthorizationUrl(requestToken); 
    System.out.println(authUrl); 
    System.out.println("\nPaste The Verifier Here:"); 
    System.out.print(">> "); 
    Verifier verifier = new Verifier(in.nextLine()); 
    System.out.println("\nTrading The Request Token For An Access Token..."); 
    accessToken = service.getAccessToken(requestToken, verifier); 
    System.out.println("Got the Access Token!"); 
    saveToken(); 
    return accessToken; 
} 

public OAuthService createService() { 

    File f = new File("service.xml"); 
    if (f.exists()) { 
     System.out.println("Feching Existing Service"); 
     loadService(); 
     return service; 
    } 
    service = new ServiceBuilder() 
      .provider(MagentoApi.class) 
      .apiKey("Consumer Key") 
      .apiSecret("Consumer Secret") 
      .build(); 
    saveService() 
    return service; 
} 

public void saveService() { 
    File file = new File("service.xml"); 
    XStream xstream = new XStream(); 
    xstream.alias("service", OAuthService.class); 
    String xml = xstream.toXML(service); 
    try { 
     FileUtil.saveFile(xml, file); 
    } catch (Exception e) { 
    } 
} 

public void saveToken() { 
    File file = new File("token.xml"); 
    XStream xstream = new XStream(); 
    xstream.alias("token", Token.class); 
    String xml = xstream.toXML(accessToken); 

    try { 
     FileUtil.saveFile(xml, file); 
    } catch (Exception e) { 
    } 
} 

@SuppressWarnings("unchecked") 
public void loadService() { 

    File file = new File("service.xml"); 
    XStream xstream = new XStream(); 
    xstream.alias("service", OAuthService.class); 
    try { 
     String xml = FileUtil.readFile(file); 
     service = (OAuthService) xstream.fromXML(xml); 
    } catch (Exception e) { 

    } 
} 

@SuppressWarnings("unchecked") 
public void loadToken() { 

    File file = new File("token.xml"); 
    XStream xstream = new XStream(); 
    xstream.alias("token", Token.class); 
    try { 
     String xml = FileUtil.readFile(file); 
     accessToken = (Token) xstream.fromXML(xml); 
    } catch (Exception e) { 
    } 
} 

} 

FileUtil.Java

package somepackage; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.IOException; 
import java.nio.charset.Charset; 
import java.nio.file.Files; 

public class FileUtil { 

private static final Charset CHARSET = Charset.forName("UTF-8"); 

public static String readFile(File file) throws IOException { 
    StringBuilder stringBuffer = new StringBuilder(); 
    BufferedReader reader = Files.newBufferedReader(file.toPath(), CHARSET); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     stringBuffer.append(line); 
    } 
    reader.close(); 
    return stringBuffer.toString(); 
} 

public static void saveFile(String content, File file) throws IOException { 
    BufferedWriter writer = Files.newBufferedWriter(file.toPath(), CHARSET); 
    writer.write(content, 0, content.length()); 
    writer.close(); 
} 
} 
+0

如果我将这些代码部署到WAR文件并发送到生产服务器,我将如何保持第一次使用Magento进行验证代码验证?我应该将Verifier代码粘贴到哪个节点的token.xml或service.xml中? – d4v1dv00