Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Arthnon

Stran: 1 2 3 [4]
46
Jakým bezpečným způsobem posílat access token na server s requestem?

Pokud udělám: https://localhost:8443/docs?access_token=12345 (a používám https) je to v pohodě? Nebo jakým jiným způsobem tu GET metodu poslat na server?

Respektive. Když dám v prohlížeči Sít (firefox), tak tu request na ten server vidím a vidím i ten access_token v tom URL samozřejmě...

Mockrát děkuji

47
A jakým způsobem zavolám potom ten request, abych dostal ten token, když použiju authorization code bez secretu?
Když v postmanovi zkouším se secretem, že nastavím basic auth. a zadám client_id a secret a do body dám grant_type, username, password, tak to funguje bez problémů. Ale pokud na autorizačním serveru dám pryč ten secret akorát, v POSTMANovi nechám Basic Auth., ale nezadám secret, tak mi to vrátí 401.

Ještě jsem četl nějaké články, kam uložit access_token a refresh_token a dočetl jsem se, že localStorage i sessionStorage nejsou bezpečné. Kam na tom front endu je tedy dobré to bezpečně uložit dle Vás? Nebo pokud bych nějakými způsoby ošetřil XSS útok na localStorage (whitelist atd), myslíte, že by to bylo ok? :-)

Děkuji

48
A ještě jedna věc, prosím.

Přemýšlím, zda použít implicit flow nebo authorization_code. Ten produkt by měl být pro jednu společnost, která bude sdílet dokumenty, události, bude požadovat přečtení dokumentu atd ve zkratce... čili bych předpokládal, že by mělo být možné uchovat "secret" někde bezpečně (jinak než například v cookies nebo localStorage). Myslíte, že mám v mém případě použít ten authorization flow nebo implicit flow?

Mockrát děkuji

49
Takže to mé řešení je v pohodě, že? :-)

Nedaří se mi zjistit, jak správně podepsat to JWT.

Na tom autorizačním serveru se mi to podepíše v pohodě (zkoušel jsem to přes tu stránku jwt.io a podpis se ověří při použití public key), ale v aplikaci nevím, jak udělat to ověření na tom resource serveru...
Zkoušel jsem i auth0, tam je problém, že nevím, jak:

1) Vložím vytvořený token tím auth0 do té odpovědi...
2) Při ověření na resource serveru bych potřeboval přístup k tomu tokenu ve stringové formě, abych to mohl přes tu jejich funkci ověřit... na to jsem také zatím nepřišel, jak na resource serveru můžu dostat přístup k access_tokenu, který tam zrovna přišel...

Ten podpis a ověření v tom mém kodu probíhá u accessTokenConverteru.

Kód: [Vybrat]
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    private static final String GRANT_TYPE_PASSWORD = "password";
    private static final String AUTHORIZATION_CODE = "authorization_code";
    private static final String REFRESH_TOKEN = "refresh_token";
    private static final String SCOPE_READ = "read";
    private static final String SCOPE_WRITE = "write";
    private static final String TRUST = "trust";
    private static final int VALID_FOREVER = -1;

    @Autowired
    private AuthenticationManager authManager;
   
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients
                .inMemory()
                .withClient(Const.CLIENT_ID)
                .secret(Const.CLIENT_SECRET)
                .authorizedGrantTypes(GRANT_TYPE_PASSWORD, AUTHORIZATION_CODE, REFRESH_TOKEN)
                .scopes(SCOPE_READ, SCOPE_WRITE, TRUST)
                .accessTokenValiditySeconds(500)
                .refreshTokenValiditySeconds(VALID_FOREVER);
    }
   
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        final JwtAccessTokenConverter converter = new JwtAccessTokenConverter(){
            @Override
            public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
                if(authentication.getOAuth2Request().getGrantType().equalsIgnoreCase("password")) {
                    final Map<String, Object> additionalInfo = new HashMap<String, Object>();
                    additionalInfo.put("organization", "NEJAKA INFORMACE");
                    ((DefaultOAuth2AccessToken) accessToken)
                            .setAdditionalInformation(additionalInfo);

                }
                accessToken = super.enhance(accessToken, authentication);
                ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(new HashMap<>());
                return accessToken;
            }
        };

       KeyStoreKeyFactory keyStoreKeyFactory =
                new KeyStoreKeyFactory(new ClassPathResource("test.jks"), "password".toCharArray());
        converter.setKeyPair(keyStoreKeyFactory.getKeyPair("test"));

        return converter;
    }
   
   
   
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter()));

        endpoints.tokenStore(tokenStore())
                .tokenEnhancer(accessTokenConverter())
                .accessTokenConverter(accessTokenConverter())
                .authenticationManager(authManager);
    }
}

Kód: [Vybrat]
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    private static final String RESOURCE_ID = "resource_id";

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId(RESOURCE_ID).stateless(false);
        resources.tokenStore(tokenStoree());
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.
                anonymous().disable()
                .authorizeRequests()
                .antMatchers("/aadmin/**").authenticated()
                .and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());

        http
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverterr() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        Resource resource = new ClassPathResource("public.txt");
        String publicKey = null;
        try {
            publicKey = IOUtils.toString(resource.getInputStream());
        } catch (final IOException e) {
            throw new RuntimeException(e);
        }
        converter.setVerifierKey(publicKey);

        return converter;
    }

    @Bean
    public DefaultTokenServices tokenServices(final TokenStore tokenStore) {
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setTokenStore(tokenStoree());
        return tokenServices;
    }


    @Bean
    public TokenStore tokenStoree() {
        return new JwtTokenStore(accessTokenConverterr());
    }

50
Narazil jsem dneska na problém při AJAxu z front endu. Nemohu dostat ten access token, když mám server na localhostu evidentně... hlási mi to CORS...
Nakonec jsem to částečně vyřešil tímto requestem pomocí jQuery.

Kód: [Vybrat]
$.ajax({
        url: 'http://localhost:8080/oauth/token',
        "async": true,
        crossDomain: true,
        type: 'POST',
        dataType: 'json',
        contentType: 'application/json; charset=UTF-8',
        headers: {"Authorization": "Basic bXktY2xpZW50Om15LXNlY3JldA==", "Content-Type": "application/x-www-form-urlencoded"},
        data: {
            "password": "George",
            "username": "pleb@seznam.cz",
            "grant_type": "password"
          },

        complete: function(result) {
            alert(result + " COMPLETE ");
        },

        success: function(result) {
            alert(result + " OK!");
        },

        error: function(result) {
            alert(result + " CHYBA");
        },
    });
    return true;
}

Nicméně aby to fungovalo, tak jsem musel ještě udělat tuto třídu na straně serveru

Kód: [Vybrat]
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsConfig implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Alow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age","3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, content-type");

        if("OPTIONS".equalsIgnoreCase(request.getMethod())){
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }


    @Override
    public void destroy() {

    }
}


Což je zřejmě nebezpečné takto to ponechat, že? Napadlo by Vás nějaké řešení, jak tohle vyřešit? Abych se dostal k tomu oauth2 tokenu bez toho, abych musel dělat ten filtr?

Stran: 1 2 3 [4]