3

HTTPS経由で通信するRESTfulWebサービスがあります。他の開発者がAPIを呼び出さないようにしたい。APIは、多数のソースからデータを取得するデータベースの前にあるため、誰がAPIを使用するかを制御したいと思います。ログインページの使用はオプションではありません

Spring-securityとOAuthを見てきましたが、どちらも私が必要としているものを正確に提供していません。ログインページをWebサービスの前に配置したくないのですが、代わりに、不明なアプリケーションがサービスを呼び出そうとしたときに400または401のhttpコードを返したいだけです。

誰かが私がこれを実装する方法をお勧めできますか?

結果この質問に対するフィードバックをありがとうございます。結局、私はmod_authz_hostと呼ばれるApacheモジュールを使用することにしました。これにより、HTTPパターンを特定のドメインに制限することができます。ドメインをスプーフィングすることは可能ですが、これは内部アプリ用であるため、セキュリティ要件はより緩和されます。以下に、Apacheモジュールの使用方法の詳細を含むスニペットを含めました。

仮想ホスト内に以下を含めます

<Location /yourProtectedServices/ws>
 Order deny,allow
 Deny from all
 Allow from trusteddomain.com
</Location>
4

2 に答える 2

2

内部システムで、アクセストークンを使用してアクセスできるアプリケーションのリストを作成できます。これらの許可されたアクセストークンを持つ開発者/クライアントアプリのみがアクセスできます。これの落とし穴は、クライアントアプリのソースコードが他の人に表示されるかどうかです。

たとえば、誰かがコードにアクセストークンを使用してAndroidアプリケーションを作成した場合、アプリストアで配布されるときにリバースエンジニアリングされる可能性があります。

更新:セキュリティに関するより詳細なビュー。 http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

于 2012-12-05T15:46:13.203 に答える
0

この基本的な例を見てください:

サーバ:

@Path("/your-path")
@RequestScoped
public class JSONService {

    private final static String  AUTH_TOKEN = "rxxkksdfnnchshs";        

    @GET
    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
    public Response fetchData(@QueryParam("auth_token") String auth_token) {

        if(AUTH_TOKEN.equals(auth_token)){

            final String results = "result: the object what you want";               

            return Response.status(Response.Status.OK).entity(results).build();  
        }
        else{

            return Response.status(Response.Status.UNAUTHORIZED).build();   
        }
    }
}

クライアント:

@ManagedBean(name="your-bean-name")
@RequestScoped
public class ResteasyClient {
    private static final String BASE_URI    = "http://localhost:8080/your-context/your-rest-path";       
    private final static String  AUTH_TOKEN = "rxxkksdfnnchshs";
    ClientRequest webResource;
    ClientResponse response; 
    private String data;  

    public DBOResteasyClient() {           

        final String Path = "/your-path";
        webResource = new ClientRequest(BASE_URI+Path);            

    }

   @Produces
   @Named
    public String getData(){
        return this.data;
    }

    @PostConstruct
    public void fetchData() {

        try{
            ClientRequest resource = webResource;      
            response = resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).queryParameter("auth_token",AUTH_TOKEN).get(ClientResponse.class); 
        }catch(Exception e ){
            //
        }

        if(response.getStatus() == 200 ){
            data = (String) response.getEntity(String.class);               
        }
    }  
} 

この例では、サーバーで@QueryParam( "auth_token")String auth_tokenを使用して、auth_tokenおよびresource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).queryParameter( "auth_token"、AUTH_TOKEN)というhttpリクエストのパラメーターを取得します。 auth_tokenというパラメータを追加します。キーは次のとおりです。サーバーはパラメータを使用して独自の値"(AUTH_TOKEN.equals(auth_token)"と比較し、残りがどのように構築されたかをhttpコードで応答します。 .OK) "http 401 if not"(Response.Status.UNAUTHORIZED) "

于 2012-12-05T17:56:33.683 に答える