精华内容
下载资源
问答
  • 现有两个不同Web工程项目,... 如何整合实现:通过一个登录页面,登录后可以操作两个web系统的功能菜单。(应该需要将用户整合到一个数据库表、部门也需要合并到一个库表,菜单是否要合并?) 不需要单加验证系统。
  • 最近想拿一个小项目来试水RESTful Web API,项目只有几个调用,比较简单,但同样需要身份验证,如果是传统的网站的话,那不用说,肯定是用户名+密码在登录页获得登录Token,并把登录Token记在Cookie和Session中作为...

    最近想拿一个小项目来试水RESTful Web API,项目只有几个调用,比较简单,但同样需要身份验证,如果是传统的网站的话,那不用说,肯定是用户名+密码在登录页获得登录Token,并把登录Token记在Cookie和Session中作为身份标识的这种方式,但现在不同了,关键是RESTful,这意味着我们设计出来的这些API是无状态的(Stateless),下一次的调用请求和这一次的调用请求应该是完全无关的,也就是说,正宗的RESTful Web API应该是每次调用都应该包含了完整的信息,没错,包括身份信息!

    那如何确保安全?传输时给密码做MD5加密?得了吧!这样做只能让你自己感觉“安全”点,其实没什么任何用处,利用现在的技术(有种叫什么Rainbow Table啥的来着?本人外行,不是很懂)很快就能算出明文密码了,而且如何防止挟持和重发攻击?

    也许你想到了,SSL,如果你打算采用SSL,请忘记一切自行设计的加密方案,因为SSL已经帮你做好了一切,包括防止监听,防止挟持,防止重发……一切都帮你考虑好了,你大胆地把明文密码写在你的包中就OK了,我向你保证没问题。

    但SSL的缺点是服务器端配置相对有点复杂,更关键的就是客户端对此支持可能不好,那你考虑一种自己的加密方法,有木有?我这里提供一种方法,思路来自于:http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/,我只是把上面的内容中整理了一下变成了我的方法。(传说中的剽窃?呵呵)方法描述如下:

    1. 假设有一个用户,用户名是guogangj,密码是123456(呃……这也能叫密码?)
    2. 他要GET http://test.com/api/orders/
    3. 于是把 http://test.com/api/orders/这个URL和一个新生成的GUID拼在一起,再用123456这个密码执行对称加密,生成的密文为XXXXOOOOXXXXOOOO(假设而已)
    4. 数据包中带上用户名guogangj和XXXXOOOOXXXXOOOO这个密文,发送给服务器
    5. 服务器收到包后,根据guogangj这个用户名到数据库中查找到123456这个密码
    6. 服务器使用123456这个密码来解密XXXXOOOOXXXXOOOO这个密文,得到了明文,即http://test.com/api/orders/这个URL和前面由客户端生成的那个GUID
    7. 服务器到一个全局的集合中查找这个GUID,看看是否已经存在,如果存在,则验证不通过,如果不存在,就将其放入这个集合中。这是为了避免重发攻击。这个全局的集合会越来越大,所以还要定期清理。
    8. 服务器再比对解密出来的URL和用户真实请求的URL是否一致,如果一致,那么认为这是合法用户,验证通过!

    这是大致过程,如果数据库里找不到该用户,或者解密错误,都被认为验证不通过。以下是一些改进:

    1. 数据库中的密码最好做一下摘要(MD5之类的),客户端对应地也要做一下。
    2. 在生成密文的时候可以考虑加入另外一些不希望被明文传输的敏感内容,甚至可以加入IP地址,并在服务器端验证。
    3. 并非每次都要真正去数据库里拿一次用户信息,也许你有更好的办法,比如一个简单的缓存(不过需要处理缓存更新的问题),或者当你的系统大到一定程度的时候,你考虑使用统一的服务来获取用户信息,这就不是缓存那么简单了,里面的文章很多,我相信现在大规模的门户网站都有自己的一套复杂的机制,所以表明上看RESTful Web API很“低效”,但这种RESTFul的思路和模式却在实际中有很大的可塑性和威力。

    这种方法应该足够安全了!

    密码根本没有在网络上传输,密文采用的是非验证的对称加密,没有密钥就无法逆转,URL验证避免了传统的身份挟持攻击(即拦截一个用户的包并冒充此用户来访问其它的资源,即便无法破解用户密码), 再用GUID来避免了重发攻击,唯一需要担心的是用户泄露了自己的密码。

    元芳,你怎么看?

    转载于:https://www.cnblogs.com/guogangj/archive/2013/01/18/2866537.html

    展开全文
  • Flask处理表单除了本身的WTForms包,使用Flask-WTF扩展来增强表单功能也是很多开发者的选择,这里我们就来讲解如何使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
  • 如何解决呢,这里介绍一种使用JWT 产生Token,为每个方法加一个Token的身份验证,这样,用户在正常登录后,获取到系统为该用户产生的Token,以后,每次调用服务端的WebApi方法时,都需要把这个Token送到服务端做...

    JSON Web Token(JWT)跨域身份验证解决方案,详细说明网上很多,这里不就重点介绍了。

    问题:WebApi项目开发完成后部署到服务器后WebApi方法任何人都可以调用,有些项目肯定是不允许的,也过不了安全审计。那如何解决呢,这里介绍一种使用JWT 产生Token,为每个方法加一个Token的身份验证,这样,用户在正常登录后,获取到系统为该用户产生的Token,以后,每次调用服务端的WebApi方法时,都需要把这个Token送到服务端做验证,只有正确的Token,才能访问,否则,服务端返回异常。同时,还可以通过这个Token来限制登录,同一时间,相同的用户,只允许存在一个有效用户。关于产生的Token如何存储,或者不存储也可以,这要看具体业务场景了,具体事情具体分析,本文主要是通过示例介绍一种思路,文中示例客户端使用Cookie存储,服务端使用了Redis。下面还是上代码吧。

    开发工具:VS2015 

    软件环境:redis

    必需工具:Newtonsoft.Json.dll, RedisClient, JWT.dll

    在需要加Token验证的webapi项目中加jwt.dll的引用

    同时也把redisclient项目引用进来,可以上git hub下载。

    然后新增一个用产生和验证Token的类JwtHelper

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using Newtonsoft.Json.Linq;
    using JWT;
    using JWT.Algorithms;
    using JWT.Serializers;
    using JWT.Exceptions;
    using CSRedis;
    
    namespace JwtToken
    {
        public class JwtHelper
        {
            private const string secret = "scott";
            public static string GenerateToken(string userCode)
            {
                try
                {
                    IDateTimeProvider provider = new UtcDateTimeProvider();
                    var now = provider.GetNow();
    
                    var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // or use JwtValidator.UnixEpoch
    
                    var secondsSinceEpoch = Math.Round((now - unixEpoch).TotalSeconds);
    
                    //3分钟后失效
                    var payload = new Dictionary<string, object>
                    {
                        { "user",userCode},
                        { "exp",secondsSinceEpoch+ 60*3 },
                        { "jti",Guid.NewGuid() }
                    };
    
                    
    
                    IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
                    IJsonSerializer serializer = new JsonNetSerializer();
                    IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                    IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
    
                    var token = encoder.Encode(payload, secret);
                    return token;
                }
                catch
                {
                    return "";
                }
            }
    
            public static string VerifyToken(string Token)
            {
                string result = "";
                try
                {
                    IDateTimeProvider provider = new UtcDateTimeProvider();
                    IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
                    IJsonSerializer serializer = new JsonNetSerializer();
                    IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                    IJwtValidator validator = new JwtValidator(serializer, provider);
                    IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
                    var json = decoder.Decode(Token, secret, verify: true);//token为之前生成的字符串
                    JObject jobj = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(json);
                    string userCode = jobj["user"].ToString();
                    RedisClient redis = new RedisClient("192.168.197.132", 6379);
                    string originalToken = redis.Get(userCode);
                    if(!Token.Equals(originalToken))
                    {
                        result = "该帐号在其它地方登录";
                    }
                }
                catch (TokenExpiredException)
                {
                    result = "Token 过期";
                }
                catch (SignatureVerificationException)
                {
                    result = "Token 不正确";
                }
                catch (Exception ex)
                {
                    result = "Token 验证出错";
                }
                return result;
            }
        }
    }

     然后在登录方法中,加入

    string _token = JwtHelper.GenerateToken(登录ID);

    将用户编码加到Token中,Token生成成功后,将该用户编码的Token存入redis并返回客户端,这里推荐将Token放入header中返加,而不是放在json中返回,放json中,容易被中途截获。

    httpResponseMessage.Headers.Add("Authorization", _token);

    header中的token数据

    客户端在收到登录验证通过的信息后,从header中取出token保存到cookie中

    $.ajax({
                url: "/api/Login/CheckLogin",
                type: "Post",
                contentType: "application/json",
                dataType: "json",
                data: JSON.stringify(objPara),
                success: function (data, textStatus, jqXHR) {
                    $.cookie("Authorization", jqXHR.getResponseHeader("Authorization"), { expires: 1, path: '/' });
                    
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    
                }
            });

    $.cookie("Authorization", jqXHR.getResponseHeader("Authorization"), { expires: 1, path: '/' })

    这句代码就是通过jqXHR.getResponseHeader("Authorization")获取header上的token后保存到cookie("Authorization")中,有效时间1天,所有页面均可访问。现在用户已经获得有效Token,接下来,每访问一次webapi,都要将该token发送给服务端,然后验证。接下来有两步工作要做,发送和验证,先说发送,服务端通过header把token送过来,那客户端也应该是通过header将token送过去,先把刚存在cookie中的token取出来

    var token = $.cookie("Authorization");

    然后在ajax调用中加入headers的参数,如下图。

    这样,token就包含在header上,被送到了服务端。

    接下来,服务端如何进行验证,这部分是个重点。在这之前,先借用一下网上的一个解释说明一下,有助于理解验证方法。

    将生成的Token发送给客户端后,随后,客户端的每次请求只需带上这个Token即可

    一般都是将Token存放在Http请求的Headers中,也就是:context.Request.Headers,那么如何接收请求头中的Token呢?接收到Token后如何验证呢?

    验证TOKEN时就需要构建 MVC Action 过滤器(AuthorizeAttribute)了,不过在构建 AuthorizeAttribute 之前,有必要对 AuthorizeAttribute 说明下,如下:

    首先,AuthorizeAttribute 类位于System.Web.Http 命名空间下及System.Web.Mvc命名空间下,

    一般情况下,如果你需要对C# MVC 控制器的访问作认证与授权,你需要用System.Web.Mvc命名空间下的 AuthorizeAttribute ,如果你需要对C# API 控制器的访问作认证与授权,你需要用System.Web.Http 命名空间下的 AuthorizeAttribute !

    看完这个解释,接下来,需要新建一个验证属性类ApiTokenCheck,这里只针对webapi方法验证,所以类继承自System.Web.Http.AuthorizeAttribute

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Web;
    using System.Web.Http;
    using System.Web.Http.Controllers;
    
    namespace JwtToken
    {
        public class ApiTokenCheck : AuthorizeAttribute
        {
            public override void OnAuthorization(HttpActionContext context)
            {
                var authHeader = context.Request.Headers.FirstOrDefault(a => a.Key == "Authorization");//获取接收的Token
                if (context.Request.Headers == null)
                {
                    context.Response = context.Request.CreateErrorResponse(System.Net.HttpStatusCode.Unauthorized, new HttpError("Token 不正确"));
                }
                if(!context.Request.Headers.Any())
                {
                    context.Response = context.Request.CreateErrorResponse(System.Net.HttpStatusCode.Unauthorized, new HttpError("Token 不正确"));
                }
                if(authHeader.Key == null)
                {
                    context.Response = context.Request.CreateErrorResponse(System.Net.HttpStatusCode.Unauthorized, new HttpError("Token 不正确"));
                }
                var token = authHeader.Value.FirstOrDefault();
                string Verify = JwtHelper.VerifyToken(token);
                if(Verify != "")
                {
                    context.Response = context.Request.CreateErrorResponse(System.Net.HttpStatusCode.Unauthorized, new HttpError(Verify));
                }
                
            }
        }
    }

    建好后,在需要进行验证的webapi方法加上验证属性即可

    加了[ApiTokenCheck]的方法被请求调用时,都会先触发OnAuthorization方法进行验证,验证不通过通过下列代码返回异常信息给浏览器

    context.Response = context.Request.CreateErrorResponse(System.Net.HttpStatusCode.Unauthorized, new HttpError(Verify));

    OK,到这里,token生成,保存,发送,接收,验证 ,验证结果返回这个流程就结束了。

    如有描述不清楚的地方,也可以直接看代码。

    本文代码位置:https://github.com/ScottFan/CsharpJwtToken

    展开全文
  • 这个标题可能并不太准确,我这样来描述一下我们的意图吧: 我们知道在Web应用程序中有几种主要的身份验证方式,典型的就是Windows验证和Forms验证。如果设置为Windows验证的话,那么既可以自动使用用户当前身份登录...

    这个标题可能并不太准确,我这样来描述一下我们的意图吧:

    我们知道在Web应用程序中有几种主要的身份验证方式,典型的就是Windows验证和Forms验证。如果设置为Windows验证的话,那么既可以自动使用用户当前身份登录(如果在一个可信任的环境中),也可以弹出一个对话框要求用户输入用户名和密码。

    再来Forms验证,顾名思义,它是有一个表单来进行验证的,在web.config中,我们通常需要指定一个loginUrl。这样用户如果没有得到授权,则需要转到这个页面输入用户名和密码。

    但是,也有的朋友跟我提到,如果我们使用Forms验证,能不能也弹出一个对话框让用户输入用户名和密码呢?这的确是一个不错的问题。

    可惜的是,Forms验证无法提供这样的功能,但我们确实可以通过自定义验证来实现

    using System;
    using System.Text;
    using System.Web;
    using System.Security.Principal;
    
    namespace DataServiceAuthenticationModule
    {
        public class AuthenticationModule : IHttpModule
        {
            const string accessDeniedStatus = "拒绝访问";
            const string accessDeniedHtml = "<html><body>401 您的请求被拒绝,因为没有通过身份验证</body></html>";
            const string realmFormatString = "Basic realm=\"{0}\"";
            const string authServerHeader = "WWW-Authenticate";
            const string authClientHeader = "Authorization";
            const string basicAuth = "Basic";
    
            #region IHttpModule 成员
    
            public void Dispose()
            {
    
            }
    
            public void Init(HttpApplication context)
            {
                context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
            }
    
            void context_AuthenticateRequest(object sender, EventArgs e)
            {
                HttpApplication context = (HttpApplication)sender;
    
                if (context.Request.Headers["Authorization"] == null)
                {
                    UnAuthorization(context);
    
                }
    
                else
                {
    
                    string credential = ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(GetBase64CredentialsFromHeader()));
                    string[] usernameandpassword = credential.Split(':');
                    bool isAuthenticate=Authenticate(usernameandpassword[0], usernameandpassword[1]);
    
                    if (!isAuthenticate)
                    {
                        UnAuthorization(context);
                    }
                    context.Context.User= new MyPrinciple(
                        new MyIdentity(usernameandpassword[0], isAuthenticate ));
                }
    
            }
    
            private static void UnAuthorization(HttpApplication context)
            {
                context.Response.ContentEncoding = Encoding.GetEncoding("GB2312");
                context.Response.StatusCode = 401;
                context.Response.StatusDescription = accessDeniedStatus;
                context.Response.Write(accessDeniedHtml);
                // TODO: not sure this is quite right wrt realm.
                context.Response.AddHeader(authServerHeader,
                    string.Format(realmFormatString, context.Request.Url.GetLeftPart(UriPartial.Authority)));
            }
    
            bool Authenticate(string username, string password)
            {
                //your code logic here to authenticate user
    
                if (username !="chenxizhang" || password!="password") return false;
                else
                    return true;
    
    
    
            }
    
            string GetBase64CredentialsFromHeader()
            {
    
                string credsHeader =HttpContext.Current.Request.Headers[authClientHeader];
    
                string creds = null;
    
    
    
                int credsPosition =
    
                  credsHeader.IndexOf(basicAuth, StringComparison.OrdinalIgnoreCase);
    
    
    
                if (credsPosition != -1)
                {
    
                    credsPosition += basicAuth.Length + 1;
    
    
    
                    creds = credsHeader.Substring(credsPosition,
    
                      credsHeader.Length - credsPosition);
    
                }
    
                return (creds);
    
            }
    
    
    
            #endregion
        }
    
        public class MyPrinciple : IPrincipal
        {
    
            private IIdentity _id;
    
            public MyPrinciple(IIdentity id)
            {
    
                _id = id;
    
            }
    
            public IIdentity Identity
            {
    
                get { return _id; }
    
            }
    
    
    
            public bool IsInRole(string role)
            {
    
                throw new NotImplementedException();
    
            }
    
    
    
        }
    
    
    
        public class MyIdentity : IIdentity
        {
    
            private bool _isAuthenticated = false;
    
            private string _name;
    
            public MyIdentity(string name, bool isAuthenticated)
            {
    
                _isAuthenticated = isAuthenticated;
    
                _name = name;
    
            }
    
            public string AuthenticationType
            {
    
                get { throw new NotImplementedException(); }
    
            }
    
    
    
            public bool IsAuthenticated
            {
    
                get { return _isAuthenticated; }
    
            }
    
            public string Name
            {
    
                get { return _name; }
    
            }
    
    
    
        }
    
    }
    

    image

    那么,在后面到底发生了什么呢?是怎么弹出这个对话框的呢?

    image

    这个对话框其实是浏览器弹出来的。浏览器收到了一个Response,内容为Unauthorized,所以它知道服务器端需要进行验证,所以它弹出了这个对话框。为了说明这一点,我们可以来看一下其他的浏览器弹出的对话框。下面这个是Google chrome浏览器弹出的

    image

    下面这个是Mozilla Firefox浏览器弹出的

    image

    那么,接下来我们看看,我们输入的用户名和密码是怎么发送给服务器的呢

    image

    我们看到了这样一串文本:

    Y2hlbnhpemhhbmc6cGFzc3dvcmQ=

    这里就是包含了我们输入的用户名和密码。注意,它并没有被加密。我们可以通过下面的几行代码很容易地将其还原为明文的字符串

    using System;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string token = "Y2hlbnhpemhhbmc6cGFzc3dvcmQ=";
                byte[] buffer = Convert.FromBase64String(token);
                string output = Encoding.ASCII.GetString(buffer);
                Console.WriteLine(output);
                Console.Read();
            }
        }
    }
     
    这是用冒号隔开的字符串。
     
    展开全文
  •  怎样在界面中加入一个JS的功能,当光标离开版块名称这个输入栏后,就会自动验证数据库里是否存在这个内容,如果存在就在提示不能这样做。 本人才学习的WEB开发,所以会有一些地方不太懂,所以请回答的时候说...
  • Android studio如何实现短信验证

    千次阅读 2017-05-13 09:50:18
    现在更多的App的抛弃了原有的密保问题的验证模式,而是更多的采用短信验证的方式,今天来教一下大家如何实现短信验证。  首先,网络上为我们提供短信验证的网站为:www.mob.com,登录该网站你会发现其为我们提供了...

      现在更多的App的抛弃了原有的密保问题的验证模式,而是更多的采用短信验证的方式,今天来教一下大家如何实现短信验证。

       首先,网络上为我们提供短信验证的网站为:www.mob.com,登录该网站你会发现其为我们提供了很多功能,其中最主要的几个分别是:shareSDK,短信验证,mobLink等,我们今天要学习的是短信验证功能。

    1.在web.com中创建账号:

       点击页面下方短信验证码SDK-->点击立即使用-->注册账号。

    后会进入下面页面:



    2.下载短信验证SDK,并且完成短信验证的相关注册,下载页面如下:



    3.点击下载后获得sdk,得到下列文件:


    4.进入到我们的android工程的文件夹里,我的是AndroidStudioProjects,找到app/libs文件夹,然后放入刚刚下载的文件中的SMSSDK中的jar和aar文件:



    5,.进入AndroidStudio的工程中,在Module的build.gradle里面将libs加入仓库(repositories),然后添加依赖(dependencies )示例如下:

    repositories{
        flatDir{
            dirs 'libs'
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.0.1'
        testCompile 'junit:junit:4.12'
        compile 'mysql:mysql-connector-java:5.1.16'
        compile name: 'SMSSDK-2.1.4', ext: 'aar'
        compile name: 'SMSSDKGUI-2.1.4', ext: 'aar'
        compile files('libs/BaiduLBS_Android.jar')
    }
    
    
    


    6.因为我们的短信验证业务涉及到很多权限,所以在AndroidManifest.xml中添加权限:

    ?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.pc.paijiajiao">
        <uses-permission android:name="android.permission.READ_CONTACTS" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-permission android:name="android.permission.READ_SMS" />
        <uses-permission android:name="android.permission.GET_TASKS" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_logo"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="uQDsPg1DGm0d1oehxcEHwZGMOlicYiiM" />


    7.在添加了权限后,开始写实现我们短信验证的代码:

     (1).xml文件(shortmessage):

    ?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_short_message"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.pc.paijiajiao.ShortMessage">
    
        <Button
            android:text="注册和绑定手机"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/message_iden"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true" />
    </RelativeLayout>
    

     (2).java代码:

    public class ShortMessage extends AppCompatActivity {
    
        Button  message_iden;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_short_message);
            //初始化
            SMSSDK.initSDK(this, "1cdab34199d58", "1f4f73a0b24b1778b900c20727872357");
            message_iden=(Button)findViewById(R.id.message_iden);
            message_iden.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    RegisterPage registerPage=new RegisterPage();
                    //注册回调事件
                    registerPage.setRegisterCallback(new EventHandler(){
                        @Override
                        public void afterEvent(int event, int result, Object data){
                            //判断结果是否已经完成
                            if(result==SMSSDK.RESULT_COMPLETE){
                                //获取数据data
                                HashMap<String,Object> maps=(HashMap<String, Object>)data;
                                //国家
                                String country=(String)maps.get("country");
                                //手机号
                                String phone=(String)maps.get("phone");
                                submitUserInfo(country,phone);
                            }
    
                        }
                    });
                    //显示注册界面
                    registerPage.show(ShortMessage.this);
                }
            });
        }
        public void submitUserInfo(String country, String phone){
            Random r=new Random();
            String uid=Math.abs(r.nextInt())+"";
            String nickName="lexuepai";
            SMSSDK.submitUserInfo(uid,nickName,null,country,phone);
        }
    }


     SMSSDK.initSDK(this, "1cdab34199d58", "1f4f73a0b24b1778b900c20727872357");中的两个代码是在注册时分配的,写入即可。
    
    
    完成后执行就能实现短信验证了。谢谢大家


    展开全文
  • 到目前,我们虽然实现登录功能,但用户登录信息的验证是有问题的,目前我偿是简单地用if语句判断用户名和密码是否为“admin/admin123”,本节我们使用D的证证系统来实现真正的用户信息验证。 一、登录Admin后台 ...
  • 此示例API展示了如何使用从头开始构建的ASP.NET Core 3.1来实现JSON Web令牌身份验证和授权。 特征 用户注册; 密码哈希; 基于角色的授权; 通过访问令牌创建登录; 刷新令牌,以在访问令牌过期时创建新的访问...
  • 一个内部系统,登录时用公司的阿里企业邮箱帐号密码登录,类似于第三方登录,但是阿里企业邮箱好像没有...如何去进行帐号密码验证。尝试过利用阿里企业邮箱登录的action,但是都是同步的。有人指导下该怎么实现吗?
  • WebApi验证

    2016-03-21 18:57:00
    如何实现RESTful Web API的身份验证 最近想拿一个小项目来试水RESTful Web API,项目只有几个调用,比较简单,但同样需要身份验证,如果是传统的网站的话,那不用说,肯定是用户名+密码在登录页获得登录Token,并...
  • YangMVC教程-如何实现用户登录

    千次阅读 2017-05-22 11:11:01
    登录逻辑为了实现登陆功能,应当弄清楚一下问题:其一,用户如何将他的用户名和密码提供给系统。其二,系统如何接受用户发来的信息。其三,如何通过数据库查询进行账户的验证。其四,如何使得系统记住登陆状态。其五...
  • 转载:Shiro在web应用中实现验证码功能 目录结构: ...本文简单讲述在web应用整合shiro后,如何实现登录验证码认证的功能。 [二]、扩展shiro的认证 创建验证码异常类:CaptchaException.java
  • (4)如果包含登录选项,直接放行,如果不包含,则需要验证用户是否登录 (5)从session中获取user,登录了就放行,没有登录就转发到登录页面 二:代码实现 @WebFilter("/*") public class LoginFilter implements Filter
  • 以前每次请求一个方法都要验证是否登录 if xxx等 现在通过global文件中的改进 反射这个方法的属性是否需要权限 要的话先验证权限.以下代码 只提供思路和演示. 如何使用 global中的写法是 protected...
  • 如何web用户定制登录表单

    千次阅读 2005-12-13 15:21:00
    如何为web用户定制登录表单环境产品: Lotus Domino平台: 无关版本: 5.x 问题配置好Domino web服务器使用基于会话的名字和...下面以R5为例,介绍如何实现该功能.(一)如果您的服务器上已经有Domino web服务器配置数
  • 但是这种方式获取的是服务端机器的信息。 举例来说,如果你使用的是Tomcat 的服务器, 那么, 以上方法获取的是... 但并不是所有项目都是使用Form验证的方式, 可能是域帐号登录, 也可能是完全不需要登录web 项目
  • Asp.net+Vue+EmelentUI的实现(二)登录验证

    千次阅读 2019-05-06 14:55:34
    在《Asp.net+Vue+EmelentUI的实现(一)框架搭建》一文中实现了简单的框架搭建,现在继续登录验证实现。我们采用的是Asp.net来构建的,所以首选asp.net的验证机制。 1.web.config的配置 <?xml version="1.0" ...
  • 我写了个AuthHttpModule类实现IHttpModule接口,...那有些页面其实是不需要登录就能访问的,我该如何识别这些页面并跳过?页面是否需要授权访问是通过web.config里system.web/authentication节点配置的。求大神帮助。
  • 我们在开网站信息系统时,常常有这样几个角色,如后台的管理员,前台的会员,以及我们各种应用的WebAPI 都需要进行登录操作及权限控制,那么在.net core如何进行设计呢。 首先我使用的是.net core 的Authentication...
  • RESTful Web Service - http身份登录认证的实现和使用(一) 一、概述:  因为RESTful的无状态特性,导致无法知道当前的请求方是否可靠,所以不得不对每次请求进行验证。但是如何更语义化的将需要验证的信息附加...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 462
精华内容 184
关键字:

web验证登录如何实现