小程序授权登录,前后端代码
时间: 2023-05-31 14:05:39 浏览: 44
前端代码:
1. 引入wx.login()获取code
```javascript
wx.login({
success: res => {
const code = res.code;
// 发送到后端进行授权登录
wx.request({
url: 'https://example.com/api/login',
method: 'POST',
data: { code },
success: res => {
// 授权成功后的操作
}
})
}
})
```
2. 调用授权按钮
```javascript
<view>
<button open-type="getUserInfo" bindgetuserinfo="getUserInfo">授权登录</button>
</view>
```
3. 获取用户信息
```javascript
getUserInfo: function (e) {
const userInfo = e.detail.userInfo;
// 发送到后端进行授权登录
wx.request({
url: 'https://example.com/api/login',
method: 'POST',
data: { userInfo },
success: res => {
// 授权成功后的操作
}
})
}
```
后端代码:
1. 获取code或用户信息,向微信服务器发送请求获取session_key和openid
```python
from urllib import request
import json
def get_session_key(code):
appid = 'your_appid'
secret = 'your_secret'
url = f'https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type=authorization_code'
with request.urlopen(url) as f:
data = f.read().decode('utf-8')
return json.loads(data)
```
2. 将session_key和openid存储到数据库中,并返回用户的token
```python
import jwt
def login(request):
if request.method == 'POST':
data = json.loads(request.body)
code = data.get('code')
userInfo = data.get('userInfo')
if code:
session_key = get_session_key(code).get('session_key')
openid = get_session_key(code).get('openid')
# 将session_key和openid存储到数据库中
token = jwt.encode({'openid': openid}, 'your_secret_key').decode()
return JsonResponse({'token': token})
elif userInfo:
# 获取用户信息,生成token并返回
openid = 'get_from_database'
token = jwt.encode({'openid': openid}, 'your_secret_key').decode()
return JsonResponse({'token': token})
return HttpResponse('Unauthorized', status=401)
```
3. 验证token是否有效
```python
import jwt
def auth_required(func):
def wrapper(request, *args, **kwargs):
try:
token = request.headers.get('Authorization').split(' ')[1]
payload = jwt.decode(token, 'your_secret_key')
openid = payload.get('openid')
# 根据openid进行操作
return func(request, *args, **kwargs)
except:
return HttpResponse('Unauthorized', status=401)
return wrapper
```