В последнее время команда разрабатывает небольшую программу, все они новички и разрабатывают, читая документацию. Будут разные проблемы в разработке.Сегодня организую процесс входа в апплет и сделаю запись.
Логин апплета — это не то же самое, что логин вашего собственного приложения, есть еще одна роль — сервер WeChat.
Согласно диаграмме последовательности процесса входа в систему, официально предоставленной WeChat, вы можете четко понять, сколько шагов требуется для входа в апплет.Подведем итоги ниже:
- Апплет запускается, и код получается через wx.login()
- Сервер разработчика должен предоставить интерфейс входа в систему, а параметром является код, полученный апплетом.
- После того, как интерфейс входа получит код, вызовите интерфейс, предоставленный WeChat, для проверки кода.
- Получите результат проверки, вы можете получить session_key и openid после успеха
- Создайте пользовательский ключ и свяжите session_key и openid с настраиваемым ключом.
- Верните пользовательский ключ к апплету
- Ключ передается с каждым запросом, и серверная часть получает openid в соответствии с ключом, чтобы идентифицировать текущую личность пользователя.
Во-первых, код WeChat дается, если вы можете проверить сгенерированный код, конечно, никакого эффекта, только микро-письмо, чтобы код был эффективным. После того, как код распространился на собственный сервис разработчика, зайдите в микрописьмо:
Привет, приятель, мой код действителен или недействителен?
WeChat сообщит вам, является ли он действительным или недействительным.Если он действителен, он также предоставит вам идентификатор пользователя, который является openid, и session_key, который является ключом сеанса. Срок действия по умолчанию session_key составляет 2 часа. Когда пользователь использует апплет, он будет автоматически обновляться. Это поддерживается WeChat.
Уведомление:
- сеансовый ключ
session_key
это пользовательские данныекриптографическая подписьключ. Для обеспечения безопасности собственных данных приложения сервер разработчикаКлюч сеанса не должен быть доставлен в апплет, а также ключ не должен предоставляться извне.. - Временный код для входа в систему можно использовать только один раз.
Итак, нам нужно создать псевдоним для session_key.Только мы знаем, с каким пользователем этот псевдоним связан, и единственная работа, которую нужно сделать, — здесь.
Я рекомендую 2 способа сделать ассоциацию:
Первое:Случайным образом сгенерируйте ключ, свяжите openid и сохраните его в Redis. Когда запрос вводится в ключ, openid напрямую получается из Redis для получения текущей информации о пользователе. Фактически, мы сами поддерживаем информацию о сеансе.
Секунда:Используйте JWT для создания маркера, привязки openid к маркеру, возврата маркера в апплет, передачи маркера при запросе и получения информации о пользователе путем анализа маркера.
Далее мы объясним второй способ и вставим некоторый код:
В апплете добавьте метод получения кода к методу onLaunch в app.js и вызовите интерфейс входа в систему для получения токена:
wx.login({
success: function (res) {
var code = res.code;
if (code) {
console.log('app启动获取用户登录凭证:' + code);
let params = { "code": code };
let result = config.requestHttp(config.url.userLogin, 'POST', params)
result.then(res => {
let data = res.data
if (data.code == 200) {
wx.setStorageSync("login_token", data.data.token);
}
}).catch(err => {
console.log(err)
});
} else {
console.log('获取用户登录态失败:' + res.errMsg);
}
}
})
Интерфейс userLogin вызывает интерфейс WeChat для проверки по коду апплета:
// 小程序获取SessionKey接口地址
String loginUrl = "https://api.weixin.qq.com/sns/jscode2session";
String url = loginUrl + "?appid=%s&secret=%s&grant_type=%s&js_code=%s";
url = String.format(url, appid, appSecret, grantType, param.getCode());
String result = restTemplate.getForObject(url, String.class);
Map<String, Object> map = JsonUtils.toBean(Map.class, result);
// 请求成功
if (map.containsKey("session_key")) {
String openid = map.get("openid").toString();
// 第一次保存到用户表,生成JWT TOKEN返回
}
Апплет должен закончить WX.Request (), инкапсулированное в общем случае, все взаимодействие с фоном использовали этот метод для вызова интерфейса, мы можем создать после входа в систему в этом методе токен. Так что каждый запрос будет фаршированным заголовком запрашивания токена, мы можем получить проверку этой проверки токена в шлюзе.
//请求封装
function requestHttp(url, method, data) {
//请求头设置
var header = {
Authorization: wx.getStorageSync("login_token")
}
return new Promise((resolve, reject) => {
wx.request({
url: config.home_config + url,
data: data,
header: header,
method: method,
success: (res => {
if (res.data.code === 200) {
resolve(res)
} else {
reject(res)
}
}),
fail: (res => {
reject(res)
})
})
})
}
Проверьте в Зууле:
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String token = request.getHeader("Authorization");
if (StringUtils.isBlank(token)) {
ctx.setSendZuulResponse(false);
ctx.set("isSuccess", false);
ctx.setResponseBody(JsonUtils.toJson(Response.fail("非法请求【缺少Authorization】", ResponseCode.NO_AUTH_CODE)));
ctx.getResponse().setContentType("application/json; charset=utf-8");
return null;
}
// 验证Token是否有效
JWTResult jwResult = JWTUtils.checkToken(token);
if (!jwResult.isStatus()) {
ctx.setSendZuulResponse(false);
ctx.set("isSuccess", false);
ctx.setResponseBody(JsonUtils.toJson(Response.fail(jwResult.getMsg(), jwResult.getCode())));
ctx.getResponse().setContentType("application/json; charset=utf-8");
return null;
}
ctx.addZuulRequestHeader("loginUserId", jwResult.getUid());
return null;
После успешной проверки установите идентификатор пользователя в заголовок запроса и передайте его внутренней службе для использования.
Должна быть проблема с использованием JWT - это аннулирование токена. Я установил время истечения 2 часа. Обычно, если пользователь открывает апплет, его нельзя использовать непрерывно более 2 часов. Логика входа в систему такова. сделано в app.js. Да, если вы введете токен в следующий раз, вы снова подадите заявку на него. Но это также можно отрегулировать, например, немного длиннее.
Суть в том, что аутентификация пользователя передается WeChat. Пока WeChat сообщает нам, что аутентификация прошла успешно, мы можем сами получить информацию о сеансе.