{"id":2117,"date":"2024-10-21T17:55:03","date_gmt":"2024-10-21T09:55:03","guid":{"rendered":"https:\/\/www.ruianding.com\/blog\/?p=2117"},"modified":"2024-10-21T17:55:03","modified_gmt":"2024-10-21T09:55:03","slug":"my-wechat-mini-program-journey-part-2-setting-up-the-back-end","status":"publish","type":"post","link":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/","title":{"rendered":"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End"},"content":{"rendered":"\n<p>As part of my ongoing project to develop a WeChat mini program (Project: StudHubPro) for managing student attendance at a study hub, I recently completed the setup of the back-end system. This blog post documents the key steps I took to configure the server, create the database, and debug some tricky proxy issues with Apache. Hopefully, this can serve as a guide for others venturing into similar projects.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Setting Up the Environment<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Server Setup<\/strong><\/h3>\n\n\n\n<p>For this project, I had already set up an <strong>Ubuntu server<\/strong> with <strong>Apache<\/strong>, using an SSL certificate via <strong>Certbot<\/strong> for HTTPS support. The server was prepared to handle secure connections, and I planned to use <strong>Flask<\/strong> for my back-end, with <strong>MySQL<\/strong> to store user data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>MySQL Database<\/strong><\/h3>\n\n\n\n<p>The first step in the back-end setup was to create the necessary database and table structures. Here&#8217;s a quick summary of the process:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Create Database<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   CREATE DATABASE studhubpro;\n   USE studhubpro;<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Create Table <code>students<\/code><\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   CREATE TABLE students (\n       student_id VARCHAR(255) PRIMARY KEY,\n       name VARCHAR(100),\n       phone_number VARCHAR(50),\n       signup_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n   );<\/pre>\n\n\n\n<p>After successfully setting up MySQL and creating the table, I moved on to develop the API that would allow the WeChat mini program to register users and log them into the system.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Developing the Flask API<\/strong><\/h2>\n\n\n\n<p>I created a simple <strong>Flask<\/strong> API to handle the user registration logic. The API receives user data from the front end, stores it in the <code>students<\/code> table, and returns a success message.<\/p>\n\n\n\n<p>Here\u2019s the core part of the <code>app.py<\/code> file that defines the <code>register<\/code> route:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from flask import Flask, request, jsonify\nimport pymysql\n\napp = Flask(__name__)\n\n# User registration API\n@app.route('\/wxmini\/studhubpro-api\/register', methods=['POST'])\ndef register():\n    data = request.json\n    user_info = data['userInfo']\n    code = data['code']\n\n    # Connect to MySQL\n    connection = pymysql.connect(\n        host='localhost',\n        user='root',\n        password='yourpassword',\n        db='studhubpro'\n    )\n    with connection.cursor() as cursor:\n        sql = \"INSERT INTO students (student_id, name, phone_number, signup_date) VALUES (UUID(), %s, %s, NOW())\"\n        cursor.execute(sql, (user_info['nickName'], ''))\n        connection.commit()\n\n    return jsonify({'message': 'Registration successful'})<\/pre>\n\n\n\n<p>I made sure to configure the MySQL credentials through a <code>config.json<\/code> file for flexibility and security. Flask was up and running smoothly, and I could test everything locally via <code>curl<\/code> or Postman.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Proxy Issue: Encountering the Apache 404<\/strong><\/h2>\n\n\n\n<p>After getting everything set up locally, I faced a frustrating issue when trying to access my API over the web. My API endpoint kept returning <code>404 Not Found<\/code> errors when accessed via the domain <code>https:\/\/www.ruianding.com\/wxmini\/studhubpro-api\/register<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The Problem<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Locally, I was able to call <code>curl http:\/\/127.0.0.1:8000\/wxmini\/studhubpro-api\/register<\/code> without any issues. This indicated that the Flask app and MySQL connection were functioning perfectly.<\/li>\n\n\n\n<li>However, when I tried to access the same route through Apache using HTTPS, I was getting 404 errors.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The Solution: Fixing Apache\u2019s ProxyPass<\/strong><\/h3>\n\n\n\n<p>After carefully reviewing the Apache configuration and examining the error logs, I realized the problem stemmed from how the proxy was handling the path. Here\u2019s what I originally had in my Apache configuration:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ProxyPass \"\/wxmini\/studhubpro-api\" \"http:\/\/127.0.0.1:8000\"\nProxyPassReverse \"\/wxmini\/studhubpro-api\" \"http:\/\/127.0.0.1:8000\"<\/pre>\n\n\n\n<p>This setup works fine for simple, static paths, but for paths like <code>\/wxmini\/studhubpro-api\/test<\/code> or dynamic segments, it can cause issues.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Switching to ProxyPassMatch<\/strong><\/h3>\n\n\n\n<p>The solution was to use <code>ProxyPassMatch<\/code>, which allows you to handle dynamic or complex paths by using regular expressions. Here\u2019s the updated configuration that finally solved the problem:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ProxyPassMatch \"^\/wxmini\/studhubpro-api\/(.*)$\" \"http:\/\/127.0.0.1:8000\/wxmini\/studhubpro-api\/$1\"<\/pre>\n\n\n\n<p>This configuration ensured that any request to <code>\/wxmini\/studhubpro-api\/*<\/code> would be properly forwarded to the Flask application running on port <code>8000<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Debugging with Logs<\/strong><\/h3>\n\n\n\n<p>To further debug the issue, I enabled detailed logging in Apache using:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">LogLevel proxy:debug<\/pre>\n\n\n\n<p>By inspecting the logs, I could confirm that the requests were now being properly proxied to Flask, and the 404 errors were gone.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. Testing the GET API<\/strong><\/h2>\n\n\n\n<p>To verify the success of the fix, I set up a simple GET API in Flask:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@app.route('\/wxmini\/studhubpro-api\/test', methods=['GET'])\ndef test_route():\n    return jsonify({'message': 'xiaowu'})<\/pre>\n\n\n\n<p>After reloading the server, I successfully tested the endpoint using:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">curl -X GET https:\/\/www.ruianding.com\/wxmini\/studhubpro-api\/test<\/pre>\n\n\n\n<p>This returned:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n    \"message\": \"xiaowu\"\n}<\/pre>\n\n\n\n<p>Everything worked perfectly!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5. Conclusion and Lessons Learned<\/strong><\/h2>\n\n\n\n<p>This part of the project taught me some valuable lessons about configuring web servers, proxying requests with Apache, and debugging issues effectively. The key takeaway here was understanding how Apache\u2019s <code>ProxyPass<\/code> and <code>ProxyPassMatch<\/code> work and when to use each.<\/p>\n\n\n\n<p>By using <code>ProxyPassMatch<\/code>, I was able to route all requests correctly to my Flask API and finally connect my WeChat mini program with the back-end database.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Next Steps<\/strong><\/h3>\n\n\n\n<p>Now that the API and database are up and running, the next phase of this project will involve expanding the functionality to handle student attendance logging and data analysis. I\u2019ll also implement a secure login system, and possibly add session management or token-based authentication for security.<\/p>\n\n\n\n<p>Stay tuned for the next update in my WeChat mini program development journey!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As part of my ongoing project to develop a WeChat mini program (Project: StudHubPro) for managing student attendance at a study hub, I recently completed the setup of the back-end system. This blog post documents the key steps I took to configure the server, create the database, and debug some tricky proxy issues with Apache. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2117","post","type-post","status-publish","format-standard","hentry","category-miscellaneous"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End - \u6781\u7b80IT\uff5cSimpleIT<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End - \u6781\u7b80IT\uff5cSimpleIT\" \/>\n<meta property=\"og:description\" content=\"As part of my ongoing project to develop a WeChat mini program (Project: StudHubPro) for managing student attendance at a study hub, I recently completed the setup of the back-end system. This blog post documents the key steps I took to configure the server, create the database, and debug some tricky proxy issues with Apache. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/\" \/>\n<meta property=\"og:site_name\" content=\"\u6781\u7b80IT\uff5cSimpleIT\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-21T09:55:03+00:00\" \/>\n<meta name=\"author\" content=\"Ruian Ding\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ruian Ding\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/\"},\"author\":{\"name\":\"Ruian Ding\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"headline\":\"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End\",\"datePublished\":\"2024-10-21T09:55:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/\"},\"wordCount\":653,\"publisher\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"articleSection\":[\"Miscellaneous\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/\",\"url\":\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/\",\"name\":\"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End - \u6781\u7b80IT\uff5cSimpleIT\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#website\"},\"datePublished\":\"2024-10-21T09:55:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.ruianding.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#website\",\"url\":\"https:\/\/www.ruianding.com\/blog\/\",\"name\":\"Ruian's Tech Troubleshooting Toolbox\",\"description\":\"Debug the World.\",\"publisher\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"alternateName\":\"\u4e01\u777f\u5b89\u7684\u6280\u672f\u5206\u4eab\u535a\u5ba2\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.ruianding.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\",\"name\":\"Ruian Ding\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png\",\"contentUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png\",\"width\":284,\"height\":284,\"caption\":\"Ruian Ding\"},\"logo\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"I am currently a Support Specialist at NIO, focusing on cloud-related issues for NIO Power. Previously, at Microsoft Entra ID, I specialized in identity and access management (IAM), including device registration, Windows Hello for Business (WHfB), multi-factor authentication (MFA), and single sign-on (SSO). In addition to my core expertise, I have a strong foundation in Active Directory, Servers, Cloud Computing, Network Administration, and Front-end Web Development. This diverse technical skill set enables me to effectively handle a wide range of challenges in a fast-paced IT environment.\",\"sameAs\":[\"https:\/\/www.ruianding.com\"],\"url\":\"https:\/\/www.ruianding.com\/blog\/author\/ruiand\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End - \u6781\u7b80IT\uff5cSimpleIT","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/","og_locale":"en_US","og_type":"article","og_title":"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End - \u6781\u7b80IT\uff5cSimpleIT","og_description":"As part of my ongoing project to develop a WeChat mini program (Project: StudHubPro) for managing student attendance at a study hub, I recently completed the setup of the back-end system. This blog post documents the key steps I took to configure the server, create the database, and debug some tricky proxy issues with Apache. [&hellip;]","og_url":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/","og_site_name":"\u6781\u7b80IT\uff5cSimpleIT","article_published_time":"2024-10-21T09:55:03+00:00","author":"Ruian Ding","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ruian Ding","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/#article","isPartOf":{"@id":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/"},"author":{"name":"Ruian Ding","@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"headline":"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End","datePublished":"2024-10-21T09:55:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/"},"wordCount":653,"publisher":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"articleSection":["Miscellaneous"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/","url":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/","name":"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End - \u6781\u7b80IT\uff5cSimpleIT","isPartOf":{"@id":"https:\/\/www.ruianding.com\/blog\/#website"},"datePublished":"2024-10-21T09:55:03+00:00","breadcrumb":{"@id":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.ruianding.com\/blog\/my-wechat-mini-program-journey-part-2-setting-up-the-back-end\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ruianding.com\/blog\/"},{"@type":"ListItem","position":2,"name":"My WeChat Mini Program Journey \u2013 Part 2: Setting Up the Back-End"}]},{"@type":"WebSite","@id":"https:\/\/www.ruianding.com\/blog\/#website","url":"https:\/\/www.ruianding.com\/blog\/","name":"Ruian's Tech Troubleshooting Toolbox","description":"Debug the World.","publisher":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"alternateName":"\u4e01\u777f\u5b89\u7684\u6280\u672f\u5206\u4eab\u535a\u5ba2","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ruianding.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b","name":"Ruian Ding","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png","contentUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png","width":284,"height":284,"caption":"Ruian Ding"},"logo":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/"},"description":"I am currently a Support Specialist at NIO, focusing on cloud-related issues for NIO Power. Previously, at Microsoft Entra ID, I specialized in identity and access management (IAM), including device registration, Windows Hello for Business (WHfB), multi-factor authentication (MFA), and single sign-on (SSO). In addition to my core expertise, I have a strong foundation in Active Directory, Servers, Cloud Computing, Network Administration, and Front-end Web Development. This diverse technical skill set enables me to effectively handle a wide range of challenges in a fast-paced IT environment.","sameAs":["https:\/\/www.ruianding.com"],"url":"https:\/\/www.ruianding.com\/blog\/author\/ruiand\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/comments?post=2117"}],"version-history":[{"count":1,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2117\/revisions"}],"predecessor-version":[{"id":2118,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2117\/revisions\/2118"}],"wp:attachment":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/media?parent=2117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/categories?post=2117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/tags?post=2117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}