精华内容
下载资源
问答
  • Spring Boot Oauth2 – AuthorizationServer:数据库处理,已应用JWT令牌方法 文档 吉特 Oauth2授权代码实践 代币发行 curl -X POST'...
  • 关于Basic Authorization 在HTTP中,Basic Authorization基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。 在发送之前是以用户名追加一个冒号然后串接...
  • 注意:此自述文件是JSONAPI::Authorization的文档。 如果您正在上的查看此内容,那么您正在查看master分支的文档。 其中可能包含与您使用的发行版无关的信息。 请参阅所用的自述文件。 JSONAPI::Authorization使用...
  • Egg-Auths Auths是eggjs的插件,主要用于完成用户身份验证和授权。 相关的API和模块主要是参考设计的。 它支持基于粗粒度的基于角色的资源访问控制和细粒度的基于资源的权限访问控制。 在当前设计中,角色和权限的...
  • 主要介绍了Lost connection to MySQL server at 'reading authorization packet', system error: 0错误解决方法,需要的朋友可以参考下
  • Please enter your authorization code ”。QQ邮箱的SMTP服务已开启。 代码如下: #!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import ...
  • 支持client credentials、password、authorization code认证模式。 项目默认最为复杂的authorization code授权码认证模式,已经实现自定义登录页、授权页、错误页,以及第三方用户登录。 1.支持/oauth/authorize,/...
  • 本篇文章介绍了,使用C#获取远程图片 Form用户名与密码Authorization认证的实现。需要的朋友参考下
  • php代码-海康摄像头HTTP获取图片。 Authorization: Digest算法 第一次... 返回头中Authorization参数用于此计算,得出新的Authorization,放于头中再次请求就得到图片
  • The OAuth 2.0 Authorization Framework The OAuth 2.0 Authorization Framework
  • Spring Authorization Server是由团队领导的社区驱动的项目,致力于向Spring社区提供支持。 该项目将作为独立项目在Spring的实验项目中开始,以便它可以更快地发展。 该项目的最终目标是取代提供的Authorization ...
  • Spring Boot安全性OAuth2-授权访问令牌 Spring Boot Security OAuth2-授权和访问令牌 请参阅在此我们将获得授权代码,然后与资源所有者交换此代码,我们将获得访问代码,并且该代码可用于身份验证(但它可以用于身份...
  • 支持具有较旧版本的spring的支持项目,这些项目希望转换为响应式和/或等待使用响应式实现发布Spring Authorization Server项目。 笔记 我无意声称Pivotal作品是我自己的作品。 我只创建旧的Spring授权服务器的React...
  • 主要介绍了vmware 装机报错VMware Workstation 未能启动 VMware Authorization Service,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 本文以最简配置搭建一个授权服务,让大家初步了解授权服务及相关表。 token 存于数据库中 例子基于Spring Boot 2.1.7.RELEASE ,使用mysql数据库
  • 利用python可以非常方便的实现邮件发送。代码也非常好理解。 思路分三大块: ...编辑邮件内容 发送 正确的代码实现 import smtplib from email.mime.text import MIMEText ...sent.login(mail_name, mail_password) # 登
  • Unity 中通过UnityWebRequest 以GET形式传authorization 的参数请求数据。 注意: 以Header头文件的形式发送请求,authorization要放入请求头部。 以头文件形式发起请求进行Token验证,token为Authorization中的...
  • 解决php获取不到客户端发来的Authorization的header头信息
  • android-授权库 从 code.google.com/p/android-authorization-library 自动导出
  • TACACS+ Authorization

    2018-11-06 17:00:19
    Privilege level assignments for commands determine the privilege level a command is executable at, provided that the user has the authorization credentials. That means, If a command is assigned to a ...
  • authorization_server.zip

    2020-03-26 14:49:46
    authorization_server授权服务,采用后端数据库存储token的方式,jdbc构建与数据库表的连接。设置客户端的配置从数据库中读取,存储在oauth_client_details表。 开启密码验证,来源于 WebSecurityConfigurerAdapter
  • 不过 Spring 官方提供了一个 由Spring官方主导,社区驱动的授权服务 spring-authorization-server,目前已经到了 0.1.2 的版本,不过该项目还是一个实验性的项目,不可在生产环境中使用,此处来使用项目搭建一个简单...

    一、背景

    Spring Security 5中,现在已经不提供了 授权服务器 的配置,但是 授权服务器 在我们平时的开发过程中用的还是比较多的。不过 Spring 官方提供了一个 由Spring官方主导,社区驱动的授权服务 spring-authorization-server,目前已经到了 0.1.2 的版本,不过该项目还是一个实验性的项目,不可在生产环境中使用,此处来使用项目搭建一个简单的授权服务器。

    二、前置知识

    1、了解 oauth2 协议、流程。可以参考阮一峰的这篇文章
    2、JWT、JWS、JWK的概念

    JWT:指的是 JSON Web Token,由 header.payload.signture 组成。不存在签名的JWT是不安全的,存在签名的JWT是不可窜改的。
    JWS:指的是签过名的JWT,即拥有签名的JWT。
    JWK:既然涉及到签名,就涉及到签名算法,对称加密还是非对称加密,那么就需要加密的 密钥或者公私钥对。此处我们将 JWT的密钥或者公私钥对统一称为 JSON WEB KEY,即 JWK。

    三、需求

    1、 完成授权码(authorization-code)流程。

    最安全的流程,需要用户的参与。

    2、 完成客户端(client credentials)流程。

    没有用户的参与,一般可以用于内部系统之间的访问,或者系统间不需要用户的参与。

    3、简化模式在新的 spring-authorization-server 项目中已经被弃用了。
    4、刷新令牌。
    5、撤销令牌。
    6、查看颁发的某个token信息。
    7、查看JWK信息。
    8、个性化JWT token,即给JWT token中增加额外信息。

    完成案例:
    张三通过QQ登录的方式来登录CSDN网站。
    登录后,CSDN就可以获取到QQ颁发的token,CSDN网站拿着token就可以获取张三在QQ资源服务器上的 个人信息 了。

    角色分析
    张三: 用户即资源拥有者
    CSDN:客户端
    QQ:授权服务器
    个人信息: 即用户的资源,保存在资源服务器中

    四、核心代码编写

    1、引入授权服务器依赖

    <dependency>
        <groupId>org.springframework.security.experimental</groupId>
        <artifactId>spring-security-oauth2-authorization-server</artifactId>
        <version>0.1.2</version>
    </dependency>
    

    2、创建授权服务器用户

    张三通过QQ登录的方式来登录CSDN网站。

    此处完成用户张三的创建,这个张三是授权服务器的用户,此处即QQ服务器的用户。

    @EnableWebSecurity
    public class DefaultSecurityConfig {
    
        @Bean
        SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests(authorizeRequests ->
                            authorizeRequests.anyRequest().authenticated()
                    )
                    .formLogin();
            return http.build();
        }
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
        // 此处创建用户,张三。
        @Bean
        UserDetailsService users() {
            UserDetails user = User.builder()
                    .username("zhangsan")
                    .password(passwordEncoder().encode("zhangsan123"))
                    .roles("USER")
                    .build();
            return new InMemoryUserDetailsManager(user);
        }
    }
    

    3、创建授权服务器和客户端

    张三通过QQ登录的方式来登录CSDN网站。

    此处完成QQ授权服务器和客户端CSDN的创建。

    package com.huan.study.authorization.config;
    
    import com.nimbusds.jose.jwk.JWKSet;
    import com.nimbusds.jose.jwk.RSAKey;
    import com.nimbusds.jose.jwk.source.JWKSource;
    import com.nimbusds.jose.proc.SecurityContext;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.Ordered;
    import org.springframework.core.annotation.Order;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
    import org.springframework.security.config.annotation.web.configurers.oauth2.server.authorization.OAuth2AuthorizationServerConfigurer;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.security.oauth2.core.AuthorizationGrantType;
    import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
    import org.springframework.security.oauth2.jwt.JwtDecoder;
    import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationConsentService;
    import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
    import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;
    import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
    import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository;
    import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
    import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
    import org.springframework.security.oauth2.server.authorization.config.ProviderSettings;
    import org.springframework.security.web.SecurityFilterChain;
    import org.springframework.security.web.util.matcher.RequestMatcher;
    
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.time.Duration;
    import java.util.UUID;
    
    /**
     * 认证服务器配置
     *
     * @author huan.fu 2021/7/12 - 下午2:08
     */
    @Configuration
    public class AuthorizationConfig {
    
        @Autowired
        private PasswordEncoder passwordEncoder;
    
    	/**
         * 个性化 JWT token
         */
        class CustomOAuth2TokenCustomizer implements OAuth2TokenCustomizer<JwtEncodingContext> {
    
            @Override
            public void customize(JwtEncodingContext context) {
                // 添加一个自定义头
                context.getHeaders().header("client-id", context.getRegisteredClient().getClientId());
            }
        }
    
        /**
         * 定义 Spring Security 的拦截器链
         */
        @Bean
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
            // 设置jwt token个性化
            http.setSharedObject(OAuth2TokenCustomizer.class, new CustomOAuth2TokenCustomizer());
            // 授权服务器配置
            OAuth2AuthorizationServerConfigurer<HttpSecurity> authorizationServerConfigurer =
                    new OAuth2AuthorizationServerConfigurer<>();
            RequestMatcher endpointsMatcher = authorizationServerConfigurer.getEndpointsMatcher();
    
            return http
                    .requestMatcher(endpointsMatcher)
                    .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated())
                    .csrf(csrf -> csrf.ignoringRequestMatchers(endpointsMatcher))
                    .apply(authorizationServerConfigurer)
                    .and()
                    .formLogin()
                    .and()
                    .build();
        }
    
        /**
         * 创建客户端信息,可以保存在内存和数据库,此处保存在数据库中
         */
        @Bean
        public RegisteredClientRepository registeredClientRepository(JdbcTemplate jdbcTemplate) {
            RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
                    // 客户端id 需要唯一
                    .clientId("csdn")
                    // 客户端密码
                    .clientSecret(passwordEncoder.encode("csdn123"))
                    // 可以基于 basic 的方式和授权服务器进行认证
                    .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
                    // 授权码
                    .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
                    // 刷新token
                    .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
                    // 客户端模式
                    .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
                    // 密码模式
                    .authorizationGrantType(AuthorizationGrantType.PASSWORD)
                    // 简化模式,已过时,不推荐
                    .authorizationGrantType(AuthorizationGrantType.IMPLICIT)
                    // 重定向url
                    .redirectUri("https://www.baidu.com")
                    // 客户端申请的作用域,也可以理解这个客户端申请访问用户的哪些信息,比如:获取用户信息,获取用户照片等
                    .scope("user.userInfo")
                    .scope("user.photos")
                    .clientSettings(clientSettings -> {
                        // 是否需要用户确认一下客户端需要获取用户的哪些权限
                        // 比如:客户端需要获取用户的 用户信息、用户照片 但是此处用户可以控制只给客户端授权获取 用户信息。
                        clientSettings.requireUserConsent(true);
                    })
                    .tokenSettings(tokenSettings -> {
                        // accessToken 的有效期
                        tokenSettings.accessTokenTimeToLive(Duration.ofHours(1));
                        // refreshToken 的有效期
                        tokenSettings.refreshTokenTimeToLive(Duration.ofDays(3));
                        // 是否可重用刷新令牌
                        tokenSettings.reuseRefreshTokens(true);
                    })
                    .build();
    
            JdbcRegisteredClientRepository jdbcRegisteredClientRepository = new JdbcRegisteredClientRepository(jdbcTemplate);
            if (null == jdbcRegisteredClientRepository.findByClientId("csdn")) {
                jdbcRegisteredClientRepository.save(registeredClient);
            }
    
            return jdbcRegisteredClientRepository;
        }
    
        /**
         * 保存授权信息,授权服务器给我们颁发来token,那我们肯定需要保存吧,由这个服务来保存
         */
        @Bean
        public OAuth2AuthorizationService authorizationService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {
            JdbcOAuth2AuthorizationService authorizationService = new JdbcOAuth2AuthorizationService(jdbcTemplate, registeredClientRepository);
    
            class CustomOAuth2AuthorizationRowMapper extends JdbcOAuth2AuthorizationService.OAuth2AuthorizationRowMapper {
                public CustomOAuth2AuthorizationRowMapper(RegisteredClientRepository registeredClientRepository) {
                    super(registeredClientRepository);
                    getObjectMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
                    this.setLobHandler(new DefaultLobHandler());
                }
            }
    
            CustomOAuth2AuthorizationRowMapper oAuth2AuthorizationRowMapper =
                    new CustomOAuth2AuthorizationRowMapper(registeredClientRepository);
    
            authorizationService.setAuthorizationRowMapper(oAuth2AuthorizationRowMapper);
            return authorizationService;
        }
    
        /**
         * 如果是授权码的流程,可能客户端申请了多个权限,比如:获取用户信息,修改用户信息,此Service处理的是用户给这个客户端哪些权限,比如只给获取用户信息的权限
         */
        @Bean
        public OAuth2AuthorizationConsentService authorizationConsentService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {
            return new JdbcOAuth2AuthorizationConsentService(jdbcTemplate, registeredClientRepository);
        }
    
        /**
         * 对JWT进行签名的 加解密密钥
         */
        @Bean
        public JWKSource<SecurityContext> jwkSource() throws NoSuchAlgorithmException {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(2048);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            RSAKey rsaKey = new RSAKey.Builder(publicKey)
                    .privateKey(privateKey)
                    .keyID(UUID.randomUUID().toString())
                    .build();
            JWKSet jwkSet = new JWKSet(rsaKey);
            return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
        }
    
        /**
         * jwt 解码
         */
        @Bean
        public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
            return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
        }
    
        /**
         * 配置一些断点的路径,比如:获取token、授权端点 等
         */
        @Bean
        public ProviderSettings providerSettings() {
            return new ProviderSettings()
                    // 配置获取token的端点路径
                    .tokenEndpoint("/oauth2/token")
                    // 发布者的url地址,一般是本系统访问的根路径
                    // 此处的 qq.com 需要修改我们系统的 host 文件
                    .issuer("http://qq.com:8080");
        }
    }
    
    

    注意⚠️:
    1、需要将 qq.com 在系统的 host 文件中与 127.0.0.1 映射起来。
    2、因为客户端信息、授权信息(token信息等)保存到数据库,因此需要将表建好。
    客户端和授权信息表
    3、详细信息看上方代码的注释

    五、测试

    从上方的代码中可知:

    资源所有者:张三 用户名和密码为:zhangsan/zhangsan123
    客户端信息:CSDN clientId和clientSecret:csdn/csdn123
    授权服务器地址: qq.com
    clientSecret 的值不可泄漏给客户端,必须保存在服务器端。

    1、授权码流程

    1、获取授权码

    http://qq.com:8080/oauth2/authorize?client_id=csdn&response_type=code&redirect_uri=https://www.baidu.com&scope=user.userInfo user.userInfo

    client_id=csdn:表示客户端是谁
    response_type=code:表示返回授权码
    scope=user.userInfo user.userInfo:获取多个权限以空格分开
    redirect_uri=https://www.baidu.com:跳转请求,用户同意或拒绝后

    2、根据授权码获取token

     curl -i -X POST \
       -H "Authorization:Basic Y3Nkbjpjc2RuMTIz" \
     'http://qq.com:8080/oauth2/token?grant_type=authorization_code&code=tDrZ-LcQDG0julJBcGY5mjtXpE04mpmXjWr9vr0-rQFP7UuNFIP6kFArcYwYo4U-iZXFiDcK4p0wihS_iUv4CBnlYRt79QDoBBXMmQBBBm9jCblEJFHZS-WalCoob6aQ&redirect_uri=https%3A%2F%2Fwww.baidu.com'
    

    Authorization: 携带具体的 clientId 和 clientSecret 的base64的值
    grant_type=authorization_code 表示采用的方式是授权码
    code=xxx:上一步获取到的授权码

    3、流程演示

    在这里插入图片描述

    2、根据刷新令牌获取token

    curl -i -X POST \
       -H "Authorization:Basic Y3Nkbjpjc2RuMTIz" \
     'http://qq.com:8080/oauth2/token?grant_type=refresh_token&refresh_token=Wpu3ruj8FhI-T1pFmnRKfadOrhsHiH1JLkVg2CCFFYd7bYPN-jICwNtPgZIXi3jcWqR6FOOBYWo56W44B5vm374nvM8FcMzTZaywu-pz3EcHvFdFmLJrqAixtTQZvMzx'
    

    在这里插入图片描述

    3、客户端模式

    此模式下,没有用户的参与,只有客户端和授权服务器之间的参与。

    curl -i -X POST \
       -H "Authorization:Basic Y3Nkbjpjc2RuMTIz" \
     'http://qq.com:8080/oauth2/token?grant_type=client_credentials'
    

    客户端模式

    4、撤销令牌

    curl -i -X POST \
     'http://qq.com:8080/oauth2/revoke?token=令牌'
    

    5、查看token 的信息

    curl -i -X POST \
       -H "Authorization:Basic Y3Nkbjpjc2RuMTIz" \
     'http://qq.com:8080/oauth2/introspect?token=XXX'
    

    token详情

    6、查看JWK信息

    curl -i -X GET \
     'http://qq.com:8080/oauth2/jwks'
    

    JWK信息

    六、完整代码

    https://gitee.com/huan1993/spring-cloud-parent/tree/master/security/authorization-server

    七、参考地址

    1、https://github.com/spring-projects-experimental/spring-authorization-server

    展开全文
  • Authorization授权

    2018-12-14 22:59:46
    Laravel官方文档讲解,该资料是一整套视频,需要逐个下载,Authorization授权
  • 使用NTLM向非Microsoft浏览器等打开IIS代理服务器
  • Laravel开发-laravel-authorization 用于管理Laravel应用程序中权限的包
  • 背景:想装一台SAP ECC服务器,先预装XP,在装XP的时候就报错:VMware Workstation 未能启动 VMware Authorization Service。您可以尝试手动启动 VMware Authorization Service。如果此问题仍然存在,请联系 VMware ...

    背景:想装一台SAP ECC服务器,先预装XP,在装XP的时候就报错:VMware Workstation 未能启动 VMware Authorization Service。您可以尝试手动启动 VMware Authorization Service。如果此问题仍然存在,请联系 VMware 支持部门。看这描述的意思是服务没起起来。

    WIN+R 输入 services.msc,找到 VMware Authorization Service右键选择然后点启动,然后发现又报了下面的错误

    展开全文
  • HTTP Authorization

    万次阅读 2019-01-17 11:36:55
    今天部署了一个Authorization项目,由于改了auth服务器客户端id和密码,而前端请求header没有修改,登录时一直弹框要求输入用户名和密码,输入后却无效,只好改前端代码。改完只好就可以了。以下是参考文章。 POST ...

    今天部署了一个Authorization项目,由于改了auth服务器客户端id和密码,而前端请求header没有修改,登录时一直弹框要求输入用户名和密码,输入后却无效,只好改前端代码。改完只好就可以了。以下是参考文章。

    POST /goform/ser2netconfigAT HTTP/1.1

    Host: 192.168.16.254
    Connection: keep-alive
    Authorization: Basic YWRtaW46YWRtaW4= //笔者注释,Authorization: "Basic 用户名和密码的base64加密字符串"   在线编解码工具
    Content-Length: 23

     

    uart=9600,8,n,1&save=1

     

    用中文简述一下http auth的过程:

    客户端发送http请求
    服务器发现配置了http auth,于是检查request里面有没有"Authorization"的http header
    如果有,则判断Authorization里面的内容是否在用户列表里面,Authorization header的典型数据为"Authorization: Basic jdhaHY0=",其中Basic表示基础认证, jdhaHY0=是base64编码的"user:passwd"字符串。如果没有,或者用户密码不对,则返回http code 401页面给客户端。
    标准的http浏览器在收到401页面之后,应该弹出一个对话框让用户输入帐号密码;并在用户点确认的时候再次发出请求,这次请求里面将带上Authorization header

    一次典型的访问场景是:
    浏览器发送http请求(没有Authorization header)
    服务器端返回401页面
    浏览器弹出认证对话框
    用户输入帐号密码,并点确认
    浏览器再次发出http请求(带着Authorization header)
    服务器端认证通过,并返回页面
    浏览器显示页面
    使用http auth的场景不会用cookie,也就是说每次都会送帐号密码信息过去。然后我们都知道base64编码基本上等于明文。这削弱了安全。
    由于种种缺点,http auth现在用的并不多。不过在路由器等场合还是有应用的,原因是http auth最简单,使用起来几乎是零成本。
    在你需要做访问控制,又不想拖上SSO、数据库之类的东西的时候,http auth不失为一个简洁的选项。

     

     

    http协议是无状态的, 浏览器和web服务器之间可以通过cookie来身份识别。 桌面应用程序(比如新浪桌面客户端, skydrive客户端)跟Web服务器之间是如何身份识别呢?

    什么是HTTP基本认证

      桌面应用程序也通过HTTP协议跟Web服务器交互, 桌面应用程序一般不会使用cookie, 而是把 "用户名+冒号+密码"用BASE64算法加密后的字符串放在http request 中的header Authorization中发送给服务端, 这种方式叫HTTP基本认证(Basic Authentication)

      当浏览器访问使用基本认证的网站的时候, 浏览器会提示你输入用户名和密码,如下图

      假如用户名密码错误的话, 服务器会返回401 如下图

      HTTP基本认证的过程

      第一步:  客户端发送http request 给服务器, 

      第二步:  因为request中没有包含Authorization header,  服务器会返回一个401 Unauthozied给客户端,并且在Response的 header "WWW-Authenticate" 中添加信息。

      第三步:客户端把用户名和密码用BASE64加密后,放在Authorization header中发送给服务器, 认证成功。

      第四步:服务器将Authorization header中的用户名密码取出,进行验证, 如果验证通过,将根据请求,发送资源给客户端

      使用Fiddler Inspectors 下的Auth 选项卡,可以很方便的看到用户名和密码:

      HTTP基本认证的优点

      HTTP基本认证,简单明了。Rest API 就是经常使用基本认证的。

      每次都要进行认证

      http协议是无状态的, 同一个客户端对 服务器的每个请求都要求认证。

      HTTP基本认证和HTTPS

      把 "用户名+冒号+密码" 用BASE64加密后的string虽然用肉眼看不出来, 但用程序很容易解密,上图可以看到Fiddler就直接给解密了。 所以这样的http request在网络上,如果用HTTP传输是很不安全的。 一般都是会用HTTPS传输,HTTPS是加密的,,所以比较安全。

      HTTP OAuth认证

      OAuth对于Http来说,就是放在Authorization header中的不是用户名密码, 而是一个token。

      微软的Skydrive 就是使用这样的方式, 如下图: 

      其他认证

      除了基本认证(Basic Authentication), 还有摘要认证digest authentication, WSSE(WS-Security)认证

      客户端的使用

      客户端如果要跟“使用基本认证的网站”交互。 非常很简单,把用户名密码加在Authorization header中就可以了。

      C#

    string url = "https://testsite";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    NetworkCredential nc = new NetworkCredential("username", "password");
    req.Credentials = nc;

      Linux下的curl

     

    curl -u username:password https://testsite/
    
    js的用法
    
    //把登录的信息放在这个里面
    $.cookie(kp.key_c_uid, 1, {expires: 1});
    $.cookie(kp.key_c_auth, "Basic " + btoa(1+":"+"oyH1Vwk4vPXgub6UkxAr3wvmfD18"));
    
    
    调接口的时候在方法前设置header信息
    beforeSend: function (xhr) {
        if (authorization) {
            xhr.setRequestHeader("Authorization", authorization);
        }
    },
    
    var authorization = $.cookie(kp.key_c_auth);
     

     

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 189,763
精华内容 75,905
关键字:

authorization