Ввести авторизацию
Внедрение концепции OAuth2
OAuth2.0 — это продолжение протокола OAuth, но оно несовместимо с OAuth 2.0 (то есть полностью отменяет OAuth1.0). OAuth 2.0 ориентирован на простоту для разработчиков клиентов. Либо путем организации согласованных взаимодействий между владельцем ресурса и поставщиком услуг HTTP от имени пользователя, либо путем предоставления доступа сторонним приложениям от имени пользователя.
Вышеприведенное взято из энциклопедии Baidu, то есть OAuth состоит из владельца ресурса (владельца ресурса), клиента (клиента) и поставщика (поставщика услуг), который состоит из двух частей: сервера авторизации (сервера аутентификации) и сервера ресурсов. (сервер ресурсов).
Авторизация веб-страниц WeChat основана на протоколе OAuth2.0. Например, когда мы хотим изменить основную информацию о пользователе в нашей официальной учетной записи, официальная учетная запись должна сначала получить данные пользователя в WeChat; или пользователю необходимо получить доступ к фотоальбому мобильного телефона при изменении изображения. Согласно традиционному методу, после входа пользователя в официальную учетную запись, сторонняя официальная учетная запись может свободно получать информацию о пользователе или все данные мобильного телефона с терминала WeChat, что вызывает скрытую опасность утечки пароля. Когда вы не хотите использовать официальную учетную запись. Беспокоитесь об утечке данных, вы можете только изменить пароль.
Процесс авторизации веб-страницы WeChat
Для решения этих проблем и появился протокол OAuth. Он изменил авторизацию имени пользователя и пароля на доступ к поставщику услуг (официальный WeChat) на сервер аутентификации (официальный WeChat) на сервер аутентификации (официальный WeChat) на сервер аутентификации (официальный WeChat) к серверу аутентификации (официальный WeChat) сервер аутентификации соглашается выдать токен, а затем стороннее приложение возьмет этот токен для подачи заявки на ресурс, требуемый сервером ресурсов (официальный представитель WeChat), и сервер ресурсов проверяется на открытие ресурсов, необходимых для этого приложения.
В частности, процесс авторизации веб-страницы делится на четыре этапа:
- Направьте пользователя на страницу авторизации, чтобы согласиться с авторизацией и получить код.
- Код обмена для авторизации веб-страницы access_token (отличается от access_token в базовой поддержке)
- При необходимости разработчик может обновить веб-страницу, чтобы авторизовать access_token, чтобы избежать истечения срока действия.
- Получить основную информацию о пользователе через авторизацию веб-страницы access_token и openid (поддерживает механизм UnionID)
Подробнее см.Официальный документ по разработке аккаунта-> Авторизация веб-страницы WeChat
подготовка к разработке
1. Инструменты веб-разработчика WeChat
Легко отлаживать на клиенте, адрес загрузки:Инструменты веб-разработчика WeChat
2. Настройте веб-аккаунт
WeChat тестирует общедоступную платформу-> Разрешения пользовательского интерфейса -> Веб-службы -> Веб-учетные записи -> Веб-авторизация для получения основной информации о пользователе -> Изменить
На данный момент доменное имя, проникающее во внутреннюю сеть, все еще используется.Если вам нужно разработать платежную функцию WeChat, вам нужно использовать настоящее доменное имя.
3. Настройте статические страницы
Согласно возвращенному json документа разработки, планируется использовать страницу для отображения информации о пользователе.
Расположение статического ресурса: templates/person.html, эта страница используется для отображения сведений о пользователе.
Шаги развития
Пользователь соглашается на авторизацию и получает код
1. URL
Согласно документации, формат URL-адреса, который ведет к авторизации веб-страницы, таков:open.WeChat.QQ.com/connect/OA U…
Уведомление:
- WECHAT будет выполнять регулярную прочную проверку сопоставления на ссылке авторизации. Если параметры ссылки не имеют неправильного порядка, страница авторизации не сможет доступен нормально;
- Перезвони
redirect_uri
, для защиты кода авторизации следует использовать ссылку https; - Область авторизации веб-страницы
snsapi_userinfo
, то можно пройтиaccess_token
иopenid
Вытягивание информации о пользователе; - Если пользователь соглашается на авторизацию, страница перейдет на страницу redirect_uri/?code=CODE&state=STATE;
- Описание параметра, как показано ниже:
2. Добавьте контроллер для пересылки страниц
Поскольку этот проект временно используетсяthymeleafШаблон не может напрямую обращаться к статическим ресурсам в проекте, поэтому вам необходимо настроить перенаправленный контроллер. (Для удобства перехода следующие страницы и URL-адреса не имеют одинаковых названий)
- IndexController:
@Controller
@RequestMapping("/api/v1/wechat1")
public class IndexController {
// 用于thymeleaf环境下,跳转到字符串相应的html页面
@RequestMapping("/{path}")
public String webPath(@PathVariable String path) {
return path;
}
@RequestMapping("/index")
public void index(String code, Model model, HttpServletRequest request, HttpServletResponse response) throws IOException {
// 显式授权,获得code
if (code != null) {
JSONObject accessTokenJson = WeChatUtil.getWebAccessToken(code);
WXPayUtil.getLogger().info("获取网页授权的AccessToken凭据: "+accessTokenJson.toJSONString());
String openid = accessTokenJson.getString(("openid"));
request.getSession().setAttribute("openid", openid);
WXPayUtil.getLogger().info("index openid={}"+openid);
// 重定向到预下单页面
response.sendRedirect("user"); // 回调的访问地址
} else {
StringBuffer url = RequestUtil.getRequestURL(request);
WXPayUtil.getLogger().info("index 请求路径:{}"+url);
String path = WeChatUtil.WEB_REDIRECT_URL.replace("APPID", WeChatConstants.APP_ID).replace("REDIRECT_URI", url).replace("SCOPE", "snsapi_userinfo");
WXPayUtil.getLogger().info("index 重定向:{}"+path);
// 重定向到授权获取code的页面
response.sendRedirect(path);
}
}
}
3. Чтобы начать проект, посетите:Зашли слишком далеко. Нет приложения Nat. Cao Cao/API/V1/Smell...
В-четвертых, в соответствии с форматом URL замените соответствующие параметры. Посетите: Страница авторизации WeChat
open.WeChat.QQ.com/connect/OA U…
5. После нажатия [Согласен] страница автоматически перейдет на [/person.html]
В перенаправленном URL вы можете увидеть код и состояние (здесь нет настроек, поэтому он пустой)
Описание кода: Код используется в качестве тикета в обмен на access_token. Код при авторизации каждого пользователя будет разным. Код можно использовать только один раз, и срок его действия автоматически истечет, если его не использовать в течение 5 минут.
Код биржи для авторизации веб-страницы access_token
1. URL
После получения кода запросите следующую ссылку, чтобы получить access_token:API.WeChat.QQ.com/SNS/OAuth2/…
Поскольку уровень безопасности секрета официальной учетной записи и полученного access_token очень высок, они должны храниться только на сервере и не могут быть переданы клиенту. Последующие шаги, такие как обновление access_token и получение информации о пользователе через access_token, также должны инициироваться с сервера.
2. Добавьте метод для получения access_token
- WeChatUtil
//获取网页授权accessToken的接口
public static final String GET_WEB_ACCESSTOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
/**
* 通过code换取网页授权access_token
* @param code
* @return
*/
public static JSONObject getWebAccessToken(String code){
String result = HttpUtil.get(GET_WEB_ACCESSTOKEN_URL.replace("APPID", WeChatConstants.APP_ID).replace("SECRET", WeChatConstants.APPSECRET).replace("CODE", code));
return JSONObject.parseObject(result);
}
Возвращаясь к описанию
Обновить access_token (при необходимости)
Поскольку срок действия access_token короткий, по истечении срока действия access_token вы можете обновить его с помощью refresh_token. Refresh_token действителен в течение 30 дней. По истечении срока действия refresh_token пользователю необходимо повторно авторизоваться.
1. URL
После получения refresh_token на втором этапе запросите следующую ссылку для получения access_token:API.WeChat.QQ.com/SNS/OAuth2/…
Заполните grant_type как refresh_token
2. Добавьте метод класса инструмента
// 获取网页授权accessToken的接口
public static final String GET_WEB_ACCESSTOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
/**
* 刷新access_token
* @param refresh_token
* @return
*/
public static JSONObject refreshWebAccessToken(String refresh_token){
String result = HttpUtil.get(GET_WEB_ACCESSTOKEN_URL.replace("APPID", WeChatConstants.APP_ID).replace("REFRESH_TOKEN", refresh_token));
return JSONObject.parseObject(result);
}
Получить информацию о пользователе (область должна быть snsapi_userinfo)
1. URL
http: GET (пожалуйста, используйте протокол https)API.WeChat.QQ.com/SNS/информация о пользователе…
2. Добавьте метод класса инструмента
/**
* 获取用户信息
* @param accessToken
* @param openId
* @return
*/
public static JSONObject getUserInfo(String accessToken,String openId){
String result = HttpUtil.get(GET_USERINFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID",openId));
return JSONObject.parseObject(result);
}
3. Добавить интерфейс для перехода к информации о пользователе.
/**
* 网页授权获取用户信息
* @param code
* @return
*/
@RequestMapping("/user")
public String person(String code,ModelMap map){
if(code!=null) {
//通过code来换取access_token
JSONObject result = WeChatUtil.getWebAccessToken(code);
//通过access_token和openid拉取用户信息
JSONObject userInfo = WeChatUtil.getUserInfo(result.getString("access_token"), result.getString("openid"));
WXPayUtil.getLogger().info("用户信息为:{}"+ JSON.toJSONString(userInfo));
//获取json对象中的键值对集合
Set<Map.Entry<String, Object>> entries = userInfo.entrySet();
for (Map.Entry<String, Object> entry : entries) {
map.addAttribute(entry.getKey(),entry.getValue());
}
}
return "person";
}
Ключевое имя, содержащее информацию о пользователе здесь, напрямую использует значение по умолчанию, возвращенное WECHAT, и на странице человека также используются имя по умолчанию.
В-четвертых, посетите снова:
open.WeChat.QQ.com/connect/OA U…
Как видите, информация, возвращенная в WeChat, была получена.
Вложение: Проверьте, действителен ли сертификат авторизации (access_token)
http: GET (пожалуйста, используйте протокол https)API.WeChat.QQ.com/SNS/AU TH?AC…