マイクロ手紙の公式文書:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
参考記事:https://blog.csdn.net/csdnsevenn/article/details/86581917
彼らは、書いた手紙のマイクロ終わりにサーバーを構成する方法について話しています。
知識ポイント
OpenIDの:マイクロチャネルの対応するユーザIDに、一意のユーザマイクロチャネルを識別すること。
コード:マイクロチャンネル({})によって提供される遠位端wx.loginコードAPIが得られ、このコードをOpenIDのSESSIONKEYを取得することができます。
トークン:トークン平均、サーバーは、トークンのクライアントとして識別要求は、長い間、あなたが独自に安全で十分ではなく、リスト上のユーザーを識別、単にOpenIDのを使用しないように試みることができるようとして、何もすることができる文字列の文字列を生成しこの例では、直接のUUIDを生成します。
UUID:典型的には、主キーとして、重複する値ではない、またはBaiduのことを知っていない
生データを:そのようなニックネームなどの情報を含むマイクロチャネルの基本的なユーザ情報、。
プロセス
まず、プロセスは、おそらく最初にすべての生データとコードの上に、バックエンドパスのフロントエンドを取得し、それについて話します。次いで、格納されたコードテーブルを使用して、ユーザが取得OpenIDの、そしてそれらは、トークン次いで戻り、次のリクエストヘッダに、前端にUUID生成トークンをバック使用プラストークンが各通話要求の前端限り、各トークンの後端が知っを識別する際にこれはユーザーということです。
Redisのの役割
ユーザ・ログイン・トークンとしてトークン、およびデータベースから検索するのではなく、キャッシュから直接取得した高速後続のユーザ情報を容易にするために、キャッシュに格納されたキャッシュキー値、など。
- 最初はのpom.xmlです。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入mybastis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!--引入mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--redis的引入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!--SHA1 加密工具包-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
<!--Apache 工具包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<!--C3P0-->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!--解析 JSON 工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.33</version>
</dependency>
<!--调用 HTTP 请求-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--逆向工程的配置-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
</project>
- コードでOpenIDのコードを取得
public SessionDTO jscode2session(String code) {
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.addHeader("content-type", "application/json")
.url(String.format(url, appid, secret, code))
.build();
try {
Response execute = okHttpClient.newCall(request).execute();
if (execute.isSuccessful()) {
//获取openid等信息
SessionDTO sessionDTO = JSON.parseObject(execute.body().string(), SessionDTO.class);
return sessionDTO;
} else {
throw new ErrorCodeException(CommonErrorCode.OBTAIN_OPENID_ERROR);
}
} catch (IOException e) {
throw new ErrorCodeException(CommonErrorCode.OBTAIN_OPENID_ERROR);
}
}
3.redis設定(シリアライズとデシリアライズを設定し、値の容易なストレージ・オブジェクトのキー、非@キャッシュ可能コメント文字列、自分の手書きの値を使用しないように覚えておいてください)
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
- Redisの利用
//插入到数据库时顺便插入到缓存中
@Override
public User insertSelective(User record) {
int flag=this.userMapper.insertSelective(record);
if (flag==0){
return null;
}
//插入成功就放入缓存
stringRedisTemplate.opsForValue().set(record.getToken(),record);
//这里是设置键的有效日期,不设置就是永久的token
// stringRedisTemplate.expire(record.getToken(), 123L, TimeUnit.SECONDS);
return record;
}
- Redisのテスト
@Test
public void test(){
ValueOperations operations=stringRedisTemplate.opsForValue();
// 通过 token 从数据库中获取信息,如果没有验证失败
// 如果通过一台设备登录,再通过另一台设备登录,第一台设备会自动登出
// 此处已经将user放到缓存中,key值为token
User openid=(User) operations.get("改成你的token值");
System.out.println(openid.getToken());
}
- 書かれcontoller
@RequestMapping("api/login")
public ResultDTO login(@RequestBody LoginDTO loginDTO){
try{
//获取openid和session_key
SessionDTO sessionDTO=wechatAdapter.jscode2session(loginDTO.getCode());
//检验传过来的数据是否已被篡改
// DigestUtil.checkDigest(loginDTO.getRawData(),loginDTO.getCode(),loginDTO.getSignature());
//获取数据
User user= JSON.parseObject(loginDTO.getRawData(),User.class);
//生成用户个人的token
String token= UUID.randomUUID().toString();
Date date = new Date();
//将user传到数据库中
user.setToken(token);
user.setUid(DateUtil.change_str(date));
userService.insertSelective(user);
TokenDTO data = new TokenDTO();
data.setToken(token);
return ResultDTO.ok(data);
}catch (ErrorCodeException e){
return ResultDTO.fail(e);
}catch (Exception e){
System.out.println(e.toString());
return ResultDTO.fail(CommonErrorCode.UNKOWN_ERROR);
}
}
ソースプロジェクト
サーバー側住所:https://github.com/jiaojiaoyow/wx_login.git
(、他人の直接の使用を小さなプログラムの終了を書くのが面倒)
アプレットエンド:https://github.com/codedrinker/jiuask
appidと秘密のアプリケーションを変更することを忘れない、ポイントの使用に注意してください、generatorConfig.xmlリバースエンジニアリング、言葉がうまくとしてインターセプタは、一般的にあまりにも注入されないように、(特にBaiduのことができます)、それを設定する必要が使用するために、設定を変更する必要があります(ソース)リマインダーであるためには、追加されました。
@Bean
public HandlerInterceptor getMyInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getMyInterceptor());
}
ああ、次のマイクロチャネル機能をどうするか、あなたも悪い所があり、特に専門的ではない、もちろん、あなたの意見を求めることができ、私を許してくださいメッセージを残し、私はにあなたのコメントを言及するためにどのような質問を持ってください